wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlanbgscan.cpp
changeset 13 ab7247ff6ef9
parent 0 c40eb8fe8501
child 14 00032b836e76
--- a/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlanbgscan.cpp	Tue Feb 02 02:03:13 2010 +0200
+++ b/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlanbgscan.cpp	Fri Mar 19 10:03:22 2010 +0200
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
 * All rights reserved.
 * This component and the accompanying materials are made available
 * under the terms of the License "Eclipse Public License v1.0"
@@ -16,7 +16,7 @@
 */
 
 /*
-* %version: 12 %
+* %version: 15 %
 */
 
 #include <e32base.h>
@@ -25,8 +25,8 @@
 #include "wlanscanproviderinterface.h"
 #include "awsinterface.h"
 #include "awsenginebase.h"
-#include "wlancbwaiter.h"
-#include "wlanbgscanawscomms.h"
+#include "wlanbgscanawscommsinterface.h"
+#include "wlanbgscanstates.h"
 #include "wlanbgscan.h"
 #include "wlandevicesettings.h" // default values in case invalid data is passed in NotifyChangedSettings
 #include "am_debug.h"
@@ -60,7 +60,8 @@
 /**
  * Formatting of date time debug string.
  */
-_LIT( KWlanBgScanDateTimeFormat, "%F %*E %*N %D %H:%T:%S" );
+_LIT( KWlanBgScanDateTimeFormat, "%F %*E %*N %Y %H:%T:%S" );
+_LIT( KWlanBgScanDateTimeFormat2, "%H%T" );
 
 /**
  * Maximun length for date time debug string.
@@ -68,24 +69,20 @@
 const TInt KWlanBgScanMaxDateTimeStrLen = 50;
 #endif
 
+
 // ======== MEMBER FUNCTIONS ========
 
 // ---------------------------------------------------------------------------
 // CWlanBgScan::CWlanBgScan
 // ---------------------------------------------------------------------------
 //
-CWlanBgScan::CWlanBgScan( MWlanScanResultProvider& aProvider, CWlanTimerServices& aTimerServices ) :
+CWlanBgScan::CWlanBgScan( MWlanScanResultProvider& aProvider, MWlanTimerServices& aTimerServices ) :
+    CWlanBgScanStates( *this, aProvider, aTimerServices ),
     iProvider ( aProvider ),
-    iCurrentBgScanInterval( 0 ),
     iAwsComms( NULL ),
-    iBgScanState( EBgScanOff ),
     iAutoPeriod( EAutoPeriodNone ),
-    iTimerServices( aTimerServices ),
-    iIntervalChangeRequestId( 0 ),
-    iBgScanPeakStartTime( 0 ),
-    iBgScanPeakEndTime( 0 ),
-    iBgScanIntervalPeak( 0 ),
-    iBgScanIntervalOffPeak( 0 )
+    iAwsOk( EFalse ),
+    iCurrentPsmServerMode( 0 )
     {
     DEBUG( "CWlanBgScan::CWlanBgScan()" );
     }
@@ -99,21 +96,21 @@
     DEBUG( "CWlanBgScan::ConstructL()" );
     
     // create AWS comms interface
-    TRAPD( err, iAwsComms = CWlanBgScanAwsComms::NewL( *this ) );
+    TRAPD( err, iAwsComms = CWlanBgScanAwsCommsFactory::InstanceL( *this ) );
     if( err != KErrNone )
         {
-        if( iAwsComms )
-            {
-            delete iAwsComms;
-            iAwsComms = NULL;
-            }
         DEBUG1( "CWlanBgScan::ConstructL() - AWS comms creation failed with code %i", err );
+
+        delete iAwsComms;
+        iAwsComms = NULL;
         }
     else
         {
         DEBUG( "CWlanBgScan::ConstructL() - AWS comms creation successful" );
         }
-        
+    
+    CWlanBgScanStates::ConstructL();
+            
     DEBUG( "CWlanBgScan::ConstructL() - done" );    
     }
 
@@ -121,7 +118,7 @@
 // CWlanBgScan::NewL
 // ---------------------------------------------------------------------------
 //
-CWlanBgScan* CWlanBgScan::NewL( MWlanScanResultProvider& aProvider, CWlanTimerServices& aTimerServices )
+CWlanBgScan* CWlanBgScan::NewL( MWlanScanResultProvider& aProvider, MWlanTimerServices& aTimerServices )
     {
     DEBUG( "CWlanBgScan::NewL()" );
     CWlanBgScan* self = new ( ELeave ) CWlanBgScan( aProvider, aTimerServices );
@@ -137,7 +134,9 @@
 //
 CWlanBgScan::~CWlanBgScan()
     {
-    DEBUG( "CWlanBgScan::CWlanBgScan()" );
+    DEBUG1( "CWlanBgScan::~CWlanBgScan() - deallocating iAwsComms @ 0x%08X", iAwsComms );
+    delete iAwsComms;
+    iAwsComms = NULL;
     }
 
 // ---------------------------------------------------------------------------
@@ -147,29 +146,13 @@
 //
 void CWlanBgScan::ScanComplete()
     {
-    DEBUG1( "CWlanBgScan::ScanComplete() - current interval %us", GetInterval() );
-
-    if ( GetInterval() != KWlanBgScanIntervalNever )
-        {
-        DEBUG1( "CWlanBgScan::ScanComplete() - issue a new request with %us as expiry", GetInterval() );
-        iProvider.Scan( GetInterval() );
-        }
-    }
+    DEBUG1( "CWlanBgScan::ScanComplete() - current interval %us", GetBgInterval() );
 
-// ---------------------------------------------------------------------------
-// From class MWlanBgScanProvider.
-// CWlanBgScan::IntervalChanged
-// ---------------------------------------------------------------------------
-//
-void CWlanBgScan::IntervalChanged( TUint32 aNewInterval )
-    {
-    DEBUG1( "CWlanBgScan::IntervalChanged() - aNewInterval %u", aNewInterval );
-
-    NextState( aNewInterval );
-            
-    DEBUG2( "CWlanBgScan::IntervalChanged() - current interval %u, current state %u",
-            GetInterval(),
-            iBgScanState );
+    if ( GetBgInterval() != KWlanBgScanIntervalNever )
+        {
+        DEBUG1( "CWlanBgScan::ScanComplete() - issue a new request with %us as expiry", GetBgInterval() );
+        iProvider.Scan( GetBgInterval() );
+        }
     }
 
 // ---------------------------------------------------------------------------
@@ -179,9 +162,9 @@
 //
 void CWlanBgScan::NotConnected()
     {
-    DEBUG1( "CWlanBgScan::NotConnected() - current interval %us", GetInterval() );
+    DEBUG1( "CWlanBgScan::NotConnected() - current interval %us", GetBgInterval() );
         
-    if ( GetInterval() != KWlanBgScanIntervalNever )
+    if ( GetBgInterval() != KWlanBgScanIntervalNever )
         {
         DEBUG( "CWlanBgScan::NotConnected() - issue a new request with immediate expiry" );
         iProvider.Scan( KWlanBgScanMaxDelayExpireImmediately );
@@ -198,9 +181,9 @@
     // If ( interval != never )                              -> Return True
     // Otherwise                                             -> return False
     DEBUG1( "CWlanBgScan::IsBgScanEnabled() - returning %u", 
-           ( GetInterval() != KWlanBgScanIntervalNever ) ? 1 : 0 );
+           ( GetBgInterval() != KWlanBgScanIntervalNever ) ? 1 : 0 );
         
-    return ( GetInterval() != KWlanBgScanIntervalNever );
+    return ( GetBgInterval() != KWlanBgScanIntervalNever );
     }
 
 // ---------------------------------------------------------------------------
@@ -218,21 +201,28 @@
             aSettings.bgScanIntervalPeak,
             aSettings.bgScanIntervalOffPeak);
     
+    // validate settings and use default values if needed
     MWlanBgScanProvider::TWlanBgScanSettings settingsToUse;
-    CheckSettings( settingsToUse, aSettings );
+    CheckSettings( settingsToUse, aSettings ); // Note: Any PSM server mode value is allowed.
     
-    iBgScanPeakStartTime = settingsToUse.bgScanPeakStartTime;
-    iBgScanPeakEndTime = settingsToUse.bgScanPeakEndTime;
-    iBgScanIntervalPeak = settingsToUse.bgScanIntervalPeak;
-    iBgScanIntervalOffPeak = settingsToUse.bgScanIntervalOffPeak;
+    // store settings for later use
+    iBgScanSettings = settingsToUse;
+    
+    IntervalChanged();
     
-    IntervalChanged( settingsToUse.backgroundScanInterval );
-        
-    if( IsAwsPresent() )
+    if( iCurrentPsmServerMode != iBgScanSettings.psmServerMode )
         {
-        CWlanBgScanAwsComms::TAwsMessage msg = { CWlanBgScanAwsComms::ESetPowerSaveMode, aSettings.psmServerMode };
-        iAwsComms->SendOrQueueAwsCommand( msg );
+        if( AwsPresence() == CWlanBgScan::EAwsPresent )
+            {
+            DEBUG( "CWlanBgScan::NotifyChangedSettings() - sending power mode command to AWS" );
+            MWlanBgScanAwsComms::TAwsMessage msg = { MWlanBgScanAwsComms::ESetPowerSaveMode, iBgScanSettings.psmServerMode };
+            iAwsComms->SendOrQueueAwsCommand( msg );
+            }
+        
+        // remember current psm server mode
+        iCurrentPsmServerMode = iBgScanSettings.psmServerMode;
         }
+    
     }
 
 // ---------------------------------------------------------------------------
@@ -269,24 +259,6 @@
     }
 
 // ---------------------------------------------------------------------------
-// CWlanBgScan::GetInterval
-// ---------------------------------------------------------------------------
-//
-TUint32 CWlanBgScan::GetInterval()
-    {
-    return iCurrentBgScanInterval;
-    }
-
-// ---------------------------------------------------------------------------
-// CWlanBgScan::SetInterval
-// ---------------------------------------------------------------------------
-//
-void CWlanBgScan::SetInterval( TUint32 aInterval )
-    {
-    iCurrentBgScanInterval = aInterval;
-    }
-
-// ---------------------------------------------------------------------------
 // CWlanBgScan::IsIntervalChangeNeeded
 // ---------------------------------------------------------------------------
 //
@@ -295,7 +267,7 @@
     TBool ret( ETrue );
     
     // no need to change interval if both peak and off-peak intervals are the same
-    if( iBgScanPeakStartTime == iBgScanPeakEndTime )
+    if( iBgScanSettings.bgScanPeakStartTime == iBgScanSettings.bgScanPeakEndTime )
         {
         ret = EFalse;
         }
@@ -343,23 +315,30 @@
     currentTime.HomeTime();
     TDateTime change_time( currentTime.DateTime() );
     
-    switch( TimeRelationToRange( currentTime, iBgScanPeakStartTime, iBgScanPeakEndTime ) )
+#ifdef _DEBUG
+    change_time = currentTime.DateTime();
+    TBuf<KWlanBgScanMaxDateTimeStrLen> timeNow;
+    TRAP_IGNORE( currentTime.FormatL( timeNow, KWlanBgScanDateTimeFormat ) );
+    DEBUG1( "CWlanBgScan::AutoIntervalChangeAt() - time now: %S", &timeNow );
+#endif
+    
+    switch( TimeRelationToRange( currentTime, iBgScanSettings.bgScanPeakStartTime, iBgScanSettings.bgScanPeakEndTime ) )
         {
         case ESmaller:
             {
-            change_time.SetHour( iBgScanPeakStartTime / KGetHours );
-            change_time.SetMinute( iBgScanPeakStartTime % KGetHours );
+            change_time.SetHour( iBgScanSettings.bgScanPeakStartTime / KGetHours );
+            change_time.SetMinute( iBgScanSettings.bgScanPeakStartTime % KGetHours );
             change_time.SetSecond( KZeroSeconds );
             currentTime = change_time;
             break;
             }
         case EInsideRange:
             {
-            change_time.SetHour( iBgScanPeakEndTime / KGetHours );
-            change_time.SetMinute( iBgScanPeakEndTime % KGetHours );
+            change_time.SetHour( iBgScanSettings.bgScanPeakEndTime / KGetHours );
+            change_time.SetMinute( iBgScanSettings.bgScanPeakEndTime % KGetHours );
             change_time.SetSecond( KZeroSeconds );
             currentTime = change_time;
-            if( iBgScanPeakStartTime > iBgScanPeakEndTime )
+            if( iBgScanSettings.bgScanPeakStartTime > iBgScanSettings.bgScanPeakEndTime )
                 {
                 DEBUG( "CWlanBgScan::AutoIntervalChangeAt() - peak end happens tomorrow" );
                 currentTime += TTimeIntervalDays( KAddOneDay );
@@ -372,8 +351,8 @@
             }
         case EGreater:
             {
-            change_time.SetHour( iBgScanPeakStartTime / KGetHours );
-            change_time.SetMinute( iBgScanPeakStartTime % KGetHours );
+            change_time.SetHour( iBgScanSettings.bgScanPeakStartTime / KGetHours );
+            change_time.SetMinute( iBgScanSettings.bgScanPeakEndTime % KGetHours );
             change_time.SetSecond( KZeroSeconds );
             currentTime = change_time;
             currentTime += TTimeIntervalDays( KAddOneDay );
@@ -399,64 +378,57 @@
     {
 #ifdef _DEBUG
     TBuf<KWlanBgScanMaxDateTimeStrLen> dbgString;
-    TRAP_IGNORE( aTime.FormatL( dbgString, KWlanBgScanDateTimeFormat ) );
+    TRAP_IGNORE( aTime.FormatL( dbgString, KWlanBgScanDateTimeFormat2 ) );
     DEBUG1( "CWlanBgScan::TimeRelationToRange() - time:  %S", &dbgString );
 #endif
-    
-    TTime time( aTime );
+        
+    TDateTime dateTime( aTime.DateTime() );
     
-    TDateTime start_time( aTime.DateTime() );
-    start_time.SetHour( aRangeStart / KGetHours );
-    start_time.SetMinute( aRangeStart % KGetHours );
-    start_time.SetSecond( KZeroSeconds );
+    TUint timeToCheck = ( dateTime.Hour() * KGetHours ) + dateTime.Minute();
+
+    DEBUG2( "CWlanBgScan::TimeRelationToRange() - range: %04u - %04u", aRangeStart, aRangeEnd );
+
+    CWlanBgScan::TRelation relation( ESmaller );
     
-    if( aRangeStart > aRangeEnd )
+    if( aRangeStart == aRangeEnd )
         {
-        DEBUG( "CWlanBgScan::TimeRelationToRange() - end time of range must to be tomorrow" );
-        if( time.DayNoInMonth() == ( time.DaysInMonth() - 1 ) )
+        DEBUG( "CWlanBgScan::TimeRelationToRange() - returning: EGreater" );
+        relation = EGreater;
+        }
+    else if( aRangeStart > aRangeEnd )
+        {
+        DEBUG( "CWlanBgScan::TimeRelationToRange() - range crosses the midnight" );
+        /**
+         * As range crosses midnight, there is no way for the relation to be ESmaller.
+         */
+        if( timeToCheck < aRangeEnd || timeToCheck >= aRangeStart )
             {
-            DEBUG( "CWlanBgScan::TimeRelationToRange() - last day of the month, move to next month" );
-            time += TTimeIntervalMonths( 1 );
-            DEBUG( "CWlanBgScan::TimeRelationToRange() - move to first day of the month" );
-            TDateTime new_time( time.DateTime() );
-            new_time.SetDay( 0 );
-
-            time = TTime( new_time );
+            DEBUG( "CWlanBgScan::TimeRelationToRange() - returning: EInsideRange" );
+            relation = EInsideRange;
             }
         else
             {
-            DEBUG( "CWlanBgScan::TimeRelationToRange() - add one day to end time" );
-            time += TTimeIntervalDays( KAddOneDay );
+            DEBUG( "CWlanBgScan::TimeRelationToRange() - returning: EGreater" );
+            relation = EGreater;
             }
         }
-    
-    TDateTime end_time( time.DateTime() );
-    end_time.SetHour( aRangeEnd / KGetHours );
-    end_time.SetMinute( aRangeEnd % KGetHours );
-    end_time.SetSecond( KZeroSeconds );
-        
-#ifdef _DEBUG
-    TBuf<KWlanBgScanMaxDateTimeStrLen> rngStart, rngEnd;
-    TRAP_IGNORE( TTime( start_time ).FormatL( rngStart, KWlanBgScanDateTimeFormat ) );
-    TRAP_IGNORE( TTime( end_time ).FormatL( rngEnd, KWlanBgScanDateTimeFormat ) );
-    DEBUG2( "CWlanBgScan::TimeRelationToRange() - range: %S - %S", &rngStart, &rngEnd );
-#endif
-    
-    CWlanBgScan::TRelation relation( ESmaller );
-    if( aTime < TTime( start_time ) )
-        {
-        DEBUG( "CWlanBgScan::TimeRelationToRange() - returning: ESmaller" );
-        relation = ESmaller;
-        }
-    else if( aTime >= TTime( start_time ) && aTime < TTime( end_time ) )
-        {
-        DEBUG( "CWlanBgScan::TimeRelationToRange() - returning: EInsideRange" );
-        relation = EInsideRange;
-        }
     else
         {
-        DEBUG( "CWlanBgScan::TimeRelationToRange() - returning: EGreater" );
-        relation = EGreater;
+        if( timeToCheck < aRangeStart )
+            {
+            DEBUG( "CWlanBgScan::TimeRelationToRange() - returning: ESmaller" );
+            relation = ESmaller;
+            }
+        else if( timeToCheck >= aRangeStart && timeToCheck < aRangeEnd )
+            {
+            DEBUG( "CWlanBgScan::TimeRelationToRange() - returning: EInsideRange" );
+            relation = EInsideRange;
+            }
+        else
+            {
+            DEBUG( "CWlanBgScan::TimeRelationToRange() - returning: EGreater" );
+            relation = EGreater;
+            }
         }
     
     return relation;
@@ -472,13 +444,13 @@
     TTime currentTime;
     currentTime.HomeTime();
 
-    if( TimeRelationToRange( currentTime, iBgScanPeakStartTime, iBgScanPeakEndTime ) == CWlanBgScan::EInsideRange )
+    if( TimeRelationToRange( currentTime, iBgScanSettings.bgScanPeakStartTime, iBgScanSettings.bgScanPeakEndTime ) == CWlanBgScan::EInsideRange )
         {
-        interval = iBgScanIntervalPeak;
+        interval = iBgScanSettings.bgScanIntervalPeak;
         }
     else
         {       
-        interval = iBgScanIntervalOffPeak;
+        interval = iBgScanSettings.bgScanIntervalOffPeak;
         }
     
     DEBUG1( "CWlanBgScan::CurrentAutoInterval() - current interval: %u", interval );
@@ -487,304 +459,23 @@
     }
 
 // ---------------------------------------------------------------------------
-// CWlanBgScan::NextState
-// ---------------------------------------------------------------------------
-//
-void CWlanBgScan::NextState( TUint32 aNewBgScanSetting )
-    {
-    DEBUG1( "CWlanBgScan::NextState() - aNewBgScanSetting %u", aNewBgScanSetting );
-    
-    switch ( iBgScanState )
-        {
-        case EBgScanOff:
-            {
-            InStateOff( iBgScanState, aNewBgScanSetting );
-            break;
-            }
-        case EBgScanOn:
-            {
-            InStateOn( iBgScanState, aNewBgScanSetting );
-            break;
-            }
-        case EBgScanAuto:
-            {
-            InStateAuto( iBgScanState, aNewBgScanSetting );
-            break;
-            }
-        case EBgScanAutoAws:
-            {
-            InStateAutoAws( iBgScanState, aNewBgScanSetting );
-            break;
-            }
-        default:
-            {
-            ASSERT( 0 );
-            break;
-            }
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CWlanBgScan::InStateOff
-// ---------------------------------------------------------------------------
-//
-void CWlanBgScan::InStateOff( TWlanBgScanState& aState, TUint32 aNewBgScanSetting )
-    {
-    switch( aNewBgScanSetting )
-        {
-        case KWlanBgScanIntervalNever:
-            {
-            DEBUG( "CWlanBgScan::InStateOff() - no change in the interval" );
-            aState = EBgScanOff;
-            break;
-            }
-        case KWlanBgScanIntervalAutomatic:
-            {
-            if ( IsAwsPresent() )
-                {
-                DEBUG( "CWlanBgScan::InStateOff() - state change Off to AutoAws" );
-
-                aState = EBgScanAutoAws;
-                DEBUG( "CWlanBgScan::InStateOff() - calling SendOrQueueAwsCommand()" );
-                CWlanBgScanAwsComms::TAwsMessage msg = { CWlanBgScanAwsComms::EStart, 0 };
-                iAwsComms->SendOrQueueAwsCommand( msg );
-                DEBUG( "CWlanBgScan::InStateOff() - SendOrQueueAwsCommand() returned" );
-                }
-            else
-                {
-                DEBUG( "CWlanBgScan::InStateOff() - state change Off to Auto" );
-                DEBUG( "CWlanBgScan::InStateOff() - * determine next interval change time and request callback" );
-                ScheduleAutoIntervalChange();
-                SetInterval( CurrentAutoInterval() );
-                if( GetInterval() != KWlanBgScanIntervalNever )
-                    {
-                    DEBUG( "CWlanBgScan::InStateOff() - * cause immediate background scan" );
-                    NotConnected();
-                    }
-                else
-                    {
-                    DEBUG( "CWlanBgScan::InStateOff() - Auto interval zero, background scanning is off" );
-                    }
-                aState = EBgScanAuto;
-                }
-            break;
-            }
-        default:
-            {
-            DEBUG1( "CWlanBgScan::InStateOff() - state change Off to On (interval: %u)", aNewBgScanSetting );
-            SetInterval( aNewBgScanSetting );
-            // cause immediate background scan
-            NotConnected();
-            aState = EBgScanOn;
-            }
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CWlanBgScan::InStateOn
+// CWlanBgScan::StartAggressiveBgScan
 // ---------------------------------------------------------------------------
 //
-void CWlanBgScan::InStateOn( TWlanBgScanState& aState, TUint32 aNewBgScanSetting )
-    {
-    switch( aNewBgScanSetting )
-        {
-        case KWlanBgScanIntervalNever:
-            {
-            DEBUG( "CWlanBgScan::InStateOn() - state change On to Off" );
-            SetInterval( KWlanBgScanIntervalNever );
-            iProvider.CancelScan();
-            aState = EBgScanOff;
-            break;
-            }
-        case KWlanBgScanIntervalAutomatic:
-            {
-            DEBUG( "CWlanBgScan::InStateOn() - state change On to Auto" );
-            SetInterval( KWlanBgScanIntervalNever );
-            iProvider.CancelScan();
-            if ( IsAwsPresent() )
-                {
-                aState = EBgScanAutoAws;
-                DEBUG( "CWlanBgScan::InStateOn() - calling SendOrQueueAwsCommand()" );
-                CWlanBgScanAwsComms::TAwsMessage msg = { CWlanBgScanAwsComms::EStart, 0 };
-                iAwsComms->SendOrQueueAwsCommand( msg );
-                DEBUG( "CWlanBgScan::InStateOn() - SendOrQueueAwsCommand() returned" );
-                }
-            else
-                {
-                DEBUG( "CWlanBgScan::InStateOn() - * determine next interval change time and request callback" );
-                ScheduleAutoIntervalChange();
-                SetInterval( CurrentAutoInterval() );
-                if( GetInterval() != KWlanBgScanIntervalNever )
-                    {
-                    DEBUG( "CWlanBgScan::InStateOn() - * cause immediate background scan" );
-                    NotConnected();
-                    }
-                else
-                    {
-                    DEBUG( "CWlanBgScan::InStateOn() - Auto interval zero, background scanning is off" );
-                    }
-                aState = EBgScanAuto;
-                }
-            break;
-            }
-        default:
-            {
-            DEBUG( "CWlanBgScan::InStateOn() - state change On to On" );
-            if ( GetInterval() == aNewBgScanSetting ) 
-                {
-                DEBUG( "CWlanBgScan::InStateOn() - no change in the interval" );
-                }
-            else if ( GetInterval() > aNewBgScanSetting )
-                {
-                DEBUG( "CWlanBgScan::InStateOn() - current interval greater than the new interval" );
-                DEBUG( "CWlanBgScan::InStateOn() - * cancel scan and cause immediate background scan" );
-                iProvider.CancelScan();
-                SetInterval( aNewBgScanSetting );
-                NotConnected();
-                }
-            else
-                {
-                DEBUG( "CWlanBgScan::InStateOn() - current interval smaller than the new interval" );
-                DEBUG( "CWlanBgScan::InStateOn() - * cancel scan and issue new with interval as expiry" );
-                iProvider.CancelScan();
-                SetInterval( aNewBgScanSetting );
-                ScanComplete();
-                }
-            aState = EBgScanOn;
-            }
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CWlanBgScan::InStateAuto
-// ---------------------------------------------------------------------------
-//
-void CWlanBgScan::InStateAuto( TWlanBgScanState& aState, TUint32 aNewBgScanSetting )
+void CWlanBgScan::StartAggressiveBgScan( TUint32& aInterval, TUint32& aTimeout )
     {
-    switch( aNewBgScanSetting )
-        {
-        case KWlanBgScanIntervalNever:
-            {
-            DEBUG( "CWlanBgScan::InStateAuto() - state change Auto to Off" );
-            SetInterval( KWlanBgScanIntervalNever );
-            iTimerServices.StopTimer( iIntervalChangeRequestId );
-            iIntervalChangeRequestId = 0;
-            iProvider.CancelScan();
-            aState = EBgScanOff;
-            break;
-            }
-        case KWlanBgScanIntervalAutomatic:
-            {
-            DEBUG( "CWlanBgScan::InStateAuto() - state still Auto" );
-            
-            ScheduleAutoIntervalChange();
-
-            TUint32 currentInterval = GetInterval();
-            
-            TUint32 autoInterval = CurrentAutoInterval();
-                        
-            if ( autoInterval == KWlanBgScanIntervalNever ) 
-                {
-                DEBUG( "CWlanBgScan::InStateAuto() - Auto interval zero, background scanning is off" );
-                DEBUG( "CWlanBgScan::InStateAuto() - * cancel scan" );
-                iProvider.CancelScan();
-                SetInterval( autoInterval );
-                }
-            else if ( currentInterval == autoInterval ) 
-                {
-                DEBUG( "CWlanBgScan::InStateAuto() - no change in the Auto interval" );
-                }
-            else if ( currentInterval > autoInterval )
-                {
-                DEBUG( "CWlanBgScan::InStateAuto() - current Auto interval greater than the new Auto interval" );
-                DEBUG( "CWlanBgScan::InStateAuto() - * cancel scan and issue new with immediate expiry" );
-                iProvider.CancelScan();
-                SetInterval( autoInterval );
-                NotConnected();
-                }
-            else
-                {
-                DEBUG( "CWlanBgScan::InStateAuto() - current Auto interval smaller than the new Auto interval" );
-                DEBUG( "CWlanBgScan::InStateAuto() - * cancel scan and issue new with interval expiry" );
-                iProvider.CancelScan();
-                SetInterval( autoInterval );
-                ScanComplete();
-                }
-            
-            aState = EBgScanAuto;
-            break;
-            }
-        default:
-            {
-            DEBUG( "CWlanBgScan::InStateAuto() - state change Auto to On" );
-            SetInterval( aNewBgScanSetting );
-            iTimerServices.StopTimer( iIntervalChangeRequestId );
-            iIntervalChangeRequestId = 0;
-            // need to issue new scan request as it is possible that currently there is
-            // no scan requested
-            iProvider.CancelScan();
-            NotConnected();
-            aState = EBgScanOn;
-            }
-        }
+    CWlanBgScanStates::StartAggressiveBgScan( aInterval, aTimeout );
     }
-
-// ---------------------------------------------------------------------------
-// CWlanBgScan::InStateAutoAws
+    
 // ---------------------------------------------------------------------------
-//
-void CWlanBgScan::InStateAutoAws( TWlanBgScanState& aState, TUint32 aNewBgScanSetting )
-    {
-    switch( aNewBgScanSetting )
-        {
-        case KWlanBgScanIntervalNever:
-            {
-            DEBUG( "CWlanBgScan::InStateAutoAws() - state change Auto to Off" );
-            SetInterval( KWlanBgScanIntervalNever );
-            aState = EBgScanOff;
-            DEBUG( "CWlanBgScan::InStateAutoAws() - calling SendOrQueueAwsCommand()" );
-            CWlanBgScanAwsComms::TAwsMessage msg = { CWlanBgScanAwsComms::EStop, 0 };
-            iAwsComms->SendOrQueueAwsCommand( msg );
-            DEBUG( "CWlanBgScan::InStateAutoAws() - SendOrQueueAwsCommand() returned" );
-            iProvider.CancelScan();
-			break;
-            }
-        case KWlanBgScanIntervalAutomatic:
-            {
-            DEBUG( "CWlanBgScan::InStateAutoAws() - no change in the interval" );
-            aState = EBgScanAutoAws;
-            break;
-            }
-        default:
-            {
-            DEBUG( "CWlanBgScan::InStateAutoAws() - state change Auto to On" );
-            SetInterval( aNewBgScanSetting );
-            aState = EBgScanOn;
-            // need to issue new scan request as it is possible that currently there is
-            // no scan requested
-            DEBUG( "CWlanBgScan::InStateAutoAws() - calling SendAwsCommand()" );
-            CWlanBgScanAwsComms::TAwsMessage msg = { CWlanBgScanAwsComms::EStop, 0 };
-            iAwsComms->SendOrQueueAwsCommand( msg );
-            DEBUG( "CWlanBgScan::InStateAutoAws() - SendAwsCommand() returned" );
-            iProvider.CancelScan();
-            NotConnected();
-            }
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CWlanBgScan::Timeout
+// CWlanBgScan::OnTimeout
 // ---------------------------------------------------------------------------
 //
 void CWlanBgScan::OnTimeout()
     {
     DEBUG( "CWlanBgScan::OnTimeout()" );
-
-    // by design, OnTimeout should only happen
-    // in Auto state
-    ASSERT( iBgScanState == EBgScanAuto );
     
-    NextState( KWlanBgScanIntervalAutomatic );
+    NextState( CWlanBgScanStates::EBgScanEventIntervalChanged );
     
     }
 
@@ -795,60 +486,88 @@
 void CWlanBgScan::DoSetInterval( TUint32 aNewInterval )
     {
     DEBUG1( "CWlanBgScan::DoSetInterval( aNewInterval: %u )", aNewInterval );
+        
+    SetAutoInterval( aNewInterval );
+    DEBUG( "CWlanBgScan::DoSetInterval() - interval stored, giving event to state machine" );
     
-    if( iBgScanState != EBgScanAutoAws )
+    NextState( CWlanBgScanStates::EBgScanEventAwsIntervalChanged );
+
+    }
+
+// ---------------------------------------------------------------------------
+// CWlanBgScan::AwsPresence
+// --------------------------------------------------------------------------
+//
+CWlanBgScan::TAwsPresence CWlanBgScan::AwsPresence()
+    {
+    CWlanBgScan::TAwsPresence ret( CWlanBgScan::EAwsPresent );
+    
+    // If ( ( iAwsOk == EFalse ) And ( iAwsComms == NULL ) )  -> Return EAwsNotPresent
+    // If ( ( iAwsOk == EFalse ) And ( iAwsComms != NULL ) )  -> Return EAwsStarting
+    // Otherwise                                              -> return EAwsPresent
+    
+    if( iAwsOk == EFalse && iAwsComms == NULL )
         {
-        DEBUG( "CWlanBgScan::DoSetInterval() - state not AutoAws, ignoring request" );
-        return;
+        ret = CWlanBgScan::EAwsNotPresent;
+        }
+    if( iAwsOk == EFalse && iAwsComms != NULL )
+        {
+        ret = CWlanBgScan::EAwsStarting;
         }
     
-    TUint32 currentInterval( GetInterval() );
-        
-    if ( ( currentInterval == 0 ) && ( aNewInterval != 0 ) )
-        {
-        DEBUG( "CWlanBgScan::DoSetInterval() - current interval is zero and new interval is non-zero" );
-        DEBUG( "CWlanBgScan::DoSetInterval() - cancel scan and issue new with immediate expiry" );
-        iProvider.CancelScan();
-        SetInterval( aNewInterval );
-        NotConnected();
-        }
-    else if ( currentInterval == aNewInterval ) 
+    DEBUG1( "CWlanBgScan::AwsStatus() - returning %i", ret );
+    
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// CWlanBgScan::AwsStartupComplete
+// --------------------------------------------------------------------------
+//
+void CWlanBgScan::AwsStartupComplete( TInt aStatus )
+    {
+    DEBUG1( "CWlanBgScan::AwsStartupComplete( aStatus: %d )", aStatus );
+    
+    SetAwsStartupStatus( aStatus );
+
+    if( aStatus == KErrNone )
         {
-        DEBUG( "CWlanBgScan::DoSetInterval() - no change in the interval" );
+        // AWS is ok
+        iAwsOk = ETrue;
         }
-    else if ( currentInterval > aNewInterval )
-        {
-        // if current interval greater than new interval -> cancel scan and 
-        // issue new with immediate expiry
-        DEBUG( "CWlanBgScan::DoSetInterval() - current interval greater than the new interval" );
-        DEBUG( "CWlanBgScan::DoSetInterval() - cancel scan and issue new with immediate expiry" );
-        iProvider.CancelScan();
-        SetInterval( aNewInterval );
-        NotConnected();
-        }
+#ifdef _DEBUG
     else
         {
-        DEBUG( "CWlanBgScan::DoSetInterval() - current interval smaller than the new interval" );
-        DEBUG( "CWlanBgScan::DoSetInterval() - take new interval into use after currently pending scan is completed" );
-        SetInterval( aNewInterval );
+        DEBUG( "CWlanBgScan::AwsStartupComplete() - error: AWS startup completed with error status, AWS not in use" );
         }
+#endif
+    
+    NextState( CWlanBgScanStates::EBgScanEventAwsStartupComplete );
     
     }
 
 // ---------------------------------------------------------------------------
-// CWlanBgScan::IsAwsPresent
+// CWlanBgScan::AwsCommandComplete
 // --------------------------------------------------------------------------
 //
-TBool CWlanBgScan::IsAwsPresent()
+void CWlanBgScan::AwsCommandComplete( MWlanBgScanAwsComms::TAwsCommand& aCommand, TInt aStatus )
     {
-    TBool ret( ETrue );
+    DEBUG2( "CWlanBgScan::AwsCommandComplete( aCommand: %d, aStatus: %d )", aCommand, aStatus );
+    
+    SetAwsCmdStatus( aCommand, aStatus );
+
+    NextState( CWlanBgScanStates::EBgScanEventAwsCmdComplete );
     
-    if( iAwsComms == NULL || !iAwsComms->IsAwsPresent() )
-        {
-        ret = EFalse;
-        }
+    }
 
-    DEBUG1( "CWlanBgScan::IsAwsPresent() - returning %i", ret );
+// ---------------------------------------------------------------------------
+// CWlanBgScan::AwsCommand
+// --------------------------------------------------------------------------
+//
+void CWlanBgScan::AwsCommand( MWlanBgScanAwsComms::TAwsMessage& aCommand )
+    {
+    DEBUG( "CWlanBgScan::AwsCommand() - calling SendOrQueueAwsCommand()" );
+    iAwsComms->SendOrQueueAwsCommand( aCommand );
     
-    return ret;
     }
+