wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlanbgscanstates.cpp
changeset 13 ab7247ff6ef9
child 14 00032b836e76
equal deleted inserted replaced
0:c40eb8fe8501 13:ab7247ff6ef9
       
     1 /*
       
     2 * Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of the License "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  This class implements WLAN background scan logic.
       
    15 *
       
    16 */
       
    17 
       
    18 /*
       
    19 * %version: 3 %
       
    20 */
       
    21 
       
    22 #include <e32base.h>
       
    23 #include <e32const.h> 
       
    24 
       
    25 #include "wlanscanproviderinterface.h"
       
    26 #include "awsinterface.h"
       
    27 #include "awsenginebase.h"
       
    28 #include "wlanbgscanawscommsinterface.h"
       
    29 #include "wlanbgscan.h"
       
    30 #include "wlanbgscanstates.h"
       
    31 #include "wlandevicesettings.h" // default values in case invalid data is passed in NotifyChangedSettings
       
    32 #include "wlantimer.h"
       
    33 #include "am_debug.h"
       
    34 
       
    35 /** Constant indicating that scanning is disabled */
       
    36 const TUint32 KWlanNoScanning( 0xFFFFFFFF );
       
    37 
       
    38 // ======== MEMBER FUNCTIONS ========
       
    39 
       
    40 // ---------------------------------------------------------------------------
       
    41 // CWlanBgScanStates::CWlanBgScanStates
       
    42 // ---------------------------------------------------------------------------
       
    43 //
       
    44 CWlanBgScanStates::CWlanBgScanStates( CWlanBgScan& aBgScan, MWlanScanResultProvider& aProvider, MWlanTimerServices& aTimerServices ) :
       
    45     iBgScan( aBgScan ),
       
    46     iUsedBgScanInterval( KWlanNoScanning ),
       
    47     iBgScanInterval( KWlanNoScanning ),
       
    48     iAggressiveBgScanInterval( KWlanNoScanning ),
       
    49     iAggressiveBgScanTimer( NULL ),
       
    50     iNextState( EBgScanStateMax ),
       
    51     iAwsStartupStatus( KErrNotFound ),
       
    52     iAwsCmd( MWlanBgScanAwsComms::EAwsCommandMax ),
       
    53     iAwsCmdStatus( KErrNone ),
       
    54     iAutoInterval( KWlanBgScanIntervalNever ),
       
    55     iProvider( aProvider ),
       
    56     iTimerServices( aTimerServices ),
       
    57     iBgScanState( EBgScanStateMax ),
       
    58     iIntervalChangeRequestId( 0 ),
       
    59     iCompletedAwsCommand( MWlanBgScanAwsComms::EAwsCommandMax ),
       
    60     iAwsCommandCompletionCode( KErrNone )
       
    61     {
       
    62     DEBUG( "CWlanBgScanStates::CWlanBgScanStates()" );
       
    63     }
       
    64 
       
    65 // ---------------------------------------------------------------------------
       
    66 // CWlanBgScanStates::ConstructL
       
    67 // ---------------------------------------------------------------------------
       
    68 //
       
    69 void CWlanBgScanStates::ConstructL()
       
    70     {
       
    71     DEBUG( "CWlanBgScanStates::ConstructL()" );
       
    72     
       
    73     if( iBgScan.AwsPresence() == CWlanBgScan::EAwsStarting )
       
    74         {
       
    75         DEBUG( "CWlanBgScanStates::ConstructL() - AWS starting up, goto Init state" );
       
    76         iBgScanState = EBgScanInit;
       
    77         }
       
    78     else
       
    79         {
       
    80         DEBUG( "CWlanBgScanStates::ConstructL() - AWS not present, goto Off state" );
       
    81         iBgScanState = EBgScanOff;
       
    82         }
       
    83         
       
    84     // Create a timer for guarding when to drop out of aggressive BG scan mode
       
    85     iAggressiveBgScanTimer = CWlanTimer::NewL( TCallBack( StopAggressiveBgScan, this ),
       
    86                                                TCallBack( StopAggressiveBgScan, this ),
       
    87                                                TCallBack( StopAggressiveBgScan, this ) );
       
    88                 
       
    89     DEBUG( "CWlanBgScanStates::ConstructL() - done" );    
       
    90     }
       
    91 
       
    92 // ---------------------------------------------------------------------------
       
    93 // CWlanBgScanStates::~CWlanBgScanStates
       
    94 // ---------------------------------------------------------------------------
       
    95 //
       
    96 CWlanBgScanStates::~CWlanBgScanStates()
       
    97     {
       
    98     DEBUG( "CWlanBgScanStates::~CWlanBgScanStates()" );
       
    99     delete iAggressiveBgScanTimer;
       
   100     }
       
   101 
       
   102 // ---------------------------------------------------------------------------
       
   103 // CWlanBgScanStates::StartAggressiveBgScan
       
   104 // ---------------------------------------------------------------------------
       
   105 //
       
   106 void CWlanBgScanStates::StartAggressiveBgScan( TUint32& aInterval, TUint32& aDuration )
       
   107     {
       
   108     DEBUG3( "CWlanBgScanStates::StartAggressiveBgScan() - new interval: %u, old interval: %u, duration: %u",
       
   109         aInterval, iAggressiveBgScanInterval, aDuration );
       
   110     // Serve the request only if the requested interval is smaller or equal than
       
   111     // what is already being served
       
   112     if( aInterval <= iAggressiveBgScanInterval )
       
   113         {
       
   114         iAggressiveBgScanInterval = aInterval;
       
   115     
       
   116         // Start the timer guarding when to drop out of aggressive mode
       
   117         iAggressiveBgScanTimer->Cancel();
       
   118         iAggressiveBgScanTimer->After( aDuration );    
       
   119     
       
   120         // Refresh interval used in BG scanning
       
   121         RefreshUsedInterval();
       
   122         }
       
   123     }
       
   124     
       
   125 // ---------------------------------------------------------------------------
       
   126 // CWlanBgScanStates::StopAggressiveBgScan
       
   127 // ---------------------------------------------------------------------------
       
   128 //
       
   129 TInt CWlanBgScanStates::StopAggressiveBgScan( TAny* aPtr )
       
   130     {
       
   131     DEBUG( "CWlanBgScanStates::StopAggressiveBgScan()" );
       
   132     
       
   133     CWlanBgScanStates* self = static_cast<CWlanBgScanStates*>( aPtr );
       
   134     
       
   135     // Disable aggressive mode
       
   136     self->iAggressiveBgScanInterval = KWlanNoScanning;
       
   137     
       
   138     // Refresh interval used in BG scanning
       
   139     self->RefreshUsedInterval();
       
   140     
       
   141     return KErrNone;
       
   142     }
       
   143 
       
   144 // ---------------------------------------------------------------------------
       
   145 // CWlanBgScanStates::GetBgInterval
       
   146 // ---------------------------------------------------------------------------
       
   147 //
       
   148 TUint32 CWlanBgScanStates::GetBgInterval()
       
   149     {
       
   150     TUint32 scanInterval( iUsedBgScanInterval );
       
   151     
       
   152     if( scanInterval == KWlanNoScanning )
       
   153         {
       
   154         scanInterval = KWlanBgScanIntervalNever;
       
   155         }
       
   156         
       
   157     return scanInterval;
       
   158     }
       
   159 
       
   160 // ---------------------------------------------------------------------------
       
   161 // CWlanBgScanStates::IntervalChanged
       
   162 // ---------------------------------------------------------------------------
       
   163 //
       
   164 void CWlanBgScanStates::IntervalChanged()
       
   165     {
       
   166     DEBUG( "CWlanBgScanStates::IntervalChanged()" );
       
   167 
       
   168     if( iBgScan.AwsPresence() == CWlanBgScan::EAwsStarting )
       
   169         {
       
   170         DEBUG( "CWlanBgScanStates::IntervalChanged() - AWS is still starting up, returning" );
       
   171         return;
       
   172         }
       
   173     
       
   174     NextState( CWlanBgScanStates::EBgScanEventIntervalChanged );
       
   175     
       
   176     DEBUG2( "CWlanBgScanStates::IntervalChanged() - current interval %u, current state %u",
       
   177             GetBgInterval(),
       
   178             iBgScanState );
       
   179     }
       
   180 
       
   181 // ---------------------------------------------------------------------------
       
   182 // CWlanBgScanStates::NextState
       
   183 // ---------------------------------------------------------------------------
       
   184 //
       
   185 void CWlanBgScanStates::NextState( const CWlanBgScanStates::TWlanBgScanSmEvent& aEvent )
       
   186     {
       
   187     DEBUG1( "CWlanBgScanStates::NextState() - aEvent %u", aEvent );
       
   188     
       
   189     switch ( iBgScanState )
       
   190         {
       
   191         case EBgScanInit:
       
   192             {
       
   193             InStateInit( iBgScanState, aEvent );
       
   194             break;
       
   195             }
       
   196         case EBgScanOff:
       
   197             {
       
   198             InStateOff( iBgScanState, aEvent );
       
   199             break;
       
   200             }
       
   201         case EBgScanOn:
       
   202             {
       
   203             InStateOn( iBgScanState, aEvent );
       
   204             break;
       
   205             }
       
   206         case EBgScanAuto:
       
   207             {
       
   208             InStateAuto( iBgScanState, aEvent );
       
   209             break;
       
   210             }
       
   211         case EBgScanAutoAws:
       
   212             {
       
   213             InStateAutoAws( iBgScanState, aEvent );
       
   214             break;
       
   215             }
       
   216         case EBgScanSendingAwsCmd:
       
   217             {
       
   218             InStateSendingAwsCmd( iBgScanState, aEvent );
       
   219             break;
       
   220             }
       
   221         default:
       
   222             {
       
   223             DEBUG1( "CWlanBgScanStates::NextState() - error: invalid state %d", iBgScanState );
       
   224             ASSERT( 0 );
       
   225             break;
       
   226             }
       
   227         }
       
   228     }
       
   229 
       
   230 // ---------------------------------------------------------------------------
       
   231 // CWlanBgScanStates::InStateInit
       
   232 // ---------------------------------------------------------------------------
       
   233 //
       
   234 void CWlanBgScanStates::InStateInit( TWlanBgScanState& aState, const CWlanBgScanStates::TWlanBgScanSmEvent& aEvent )
       
   235     {
       
   236     switch( aEvent )
       
   237         {
       
   238         case CWlanBgScanStates::EBgScanEventAwsStartupComplete:
       
   239             {
       
   240             DEBUG( "CWlanBgScanStates::InStateInit() - event: EBgScanEventAwsStartupComplete" );
       
   241             switch( AwsStartupStatus() )
       
   242                 {
       
   243                 case KErrNone:
       
   244                     {
       
   245                     DEBUG( "CWlanBgScanStates::InStateInit() - AWS startup successful" );
       
   246                     switch ( iBgScanSettings.backgroundScanInterval )
       
   247                         {
       
   248                         case KWlanBgScanIntervalNever:
       
   249                             {
       
   250                             DEBUG( "CWlanBgScanStates::InStateInit() - state change Init to Off" );
       
   251                             StateChangeInitToOff( aState );
       
   252                             break;
       
   253                             }
       
   254                         case KWlanBgScanIntervalAutomatic:
       
   255                             {
       
   256                             DEBUG( "CWlanBgScanStates::InStateInit() - state change Init to AutoAws" );
       
   257                             StateChangeInitToAutoAws( aState );
       
   258                             break;
       
   259                             }
       
   260                         default:
       
   261                             {
       
   262                             DEBUG( "CWlanBgScanStates::InStateInit() - state change Init to On" );
       
   263                             StateChangeInitToOn( aState );
       
   264                             }
       
   265                         }
       
   266                     break;
       
   267                     }
       
   268                 default:
       
   269                     {
       
   270                     DEBUG1( "CWlanBgScanStates::InStateInit() - AWS startup failed! Status %d", AwsStartupStatus() );
       
   271                     switch ( iBgScanSettings.backgroundScanInterval )
       
   272                         {
       
   273                         case KWlanBgScanIntervalNever:
       
   274                             {
       
   275                             DEBUG( "CWlanBgScanStates::InStateInit() - state change Init to Off" );
       
   276                             StateChangeInitToOff( aState );
       
   277                             break;
       
   278                             }
       
   279                         case KWlanBgScanIntervalAutomatic:
       
   280                             {
       
   281                             DEBUG( "CWlanBgScanStates::InStateInit() - state change Init to Auto" );
       
   282                             StateChangeInitToAuto( aState );
       
   283                             break;
       
   284                             }
       
   285                         default:
       
   286                             {
       
   287                             DEBUG( "CWlanBgScanStates::InStateInit() - state change Init to On" );
       
   288                             StateChangeInitToOn( aState );
       
   289                             break;
       
   290                             }
       
   291                         }
       
   292                     break;
       
   293                     }
       
   294                 }
       
   295             break;
       
   296             }
       
   297         default:
       
   298             {
       
   299             DEBUG1( "CWlanBgScanStates::InStateInit() - event %d ignored", aEvent );
       
   300             }
       
   301         }
       
   302     }
       
   303 
       
   304 // ---------------------------------------------------------------------------
       
   305 // CWlanBgScanStates::StateChangeInitToOn
       
   306 // ---------------------------------------------------------------------------
       
   307 //
       
   308 void CWlanBgScanStates::StateChangeInitToOn( TWlanBgScanState& aState )
       
   309     {
       
   310     DEBUG( "CWlanBgScanStates::StateChangeInitToOn()" );
       
   311     aState = EBgScanOn;
       
   312     SetInterval( iBgScanSettings.backgroundScanInterval );
       
   313     }
       
   314 
       
   315 // ---------------------------------------------------------------------------
       
   316 // CWlanBgScanStates::StateChangeInitToOff
       
   317 // ---------------------------------------------------------------------------
       
   318 //
       
   319 void CWlanBgScanStates::StateChangeInitToOff( TWlanBgScanState& aState )
       
   320     {
       
   321     DEBUG( "CWlanBgScanStates::StateChangeInitToOff()" );
       
   322     aState = EBgScanOff;
       
   323     SetInterval( KWlanBgScanIntervalNever );
       
   324     }
       
   325 
       
   326 // ---------------------------------------------------------------------------
       
   327 // CWlanBgScanStates::StateChangeInitToAuto
       
   328 // ---------------------------------------------------------------------------
       
   329 //
       
   330 void CWlanBgScanStates::StateChangeInitToAuto( TWlanBgScanState& aState )
       
   331     {
       
   332     aState = EBgScanAuto;
       
   333     DEBUG( "CWlanBgScanStates::StateChangeInitToAuto() - determine next interval change time and request callback" );
       
   334     iBgScan.ScheduleAutoIntervalChange();
       
   335     SetInterval( iBgScan.CurrentAutoInterval() );
       
   336     }
       
   337 
       
   338 // ---------------------------------------------------------------------------
       
   339 // CWlanBgScanStates::InStateOff
       
   340 // ---------------------------------------------------------------------------
       
   341 //
       
   342 void CWlanBgScanStates::InStateOff( TWlanBgScanState& aState, const CWlanBgScanStates::TWlanBgScanSmEvent& aEvent )
       
   343     {
       
   344     switch( aEvent )
       
   345         {
       
   346         case CWlanBgScanStates::EBgScanEventIntervalChanged:
       
   347             {
       
   348             DEBUG( "CWlanBgScanStates::InStateOff() - event: EBgScanEventIntervalChanged" );
       
   349             switch( iBgScanSettings.backgroundScanInterval )
       
   350                 {
       
   351                 case KWlanBgScanIntervalNever:
       
   352                     {
       
   353                     DEBUG( "CWlanBgScanStates::InStateOff() - no change in the interval" );
       
   354                     aState = EBgScanOff;
       
   355                     break;
       
   356                     }
       
   357                 case KWlanBgScanIntervalAutomatic:
       
   358                     {
       
   359                     DEBUG( "CWlanBgScanStates::InStateOff() - state change Off to Automatic" );
       
   360                     StateChangeOffToAutomatic( aState );
       
   361                     break;
       
   362                     }
       
   363                 default:
       
   364                     {
       
   365                     DEBUG1( "CWlanBgScanStates::InStateOff() - state change Off to On (interval: %u)", iBgScanSettings.backgroundScanInterval );
       
   366                     StateChangeOffToOn( aState, iBgScanSettings.backgroundScanInterval );
       
   367                     }
       
   368                 }
       
   369             break;
       
   370             }
       
   371         default:
       
   372             {
       
   373             DEBUG1( "CWlanBgScanStates::InStateOff() - event %d ignored", aEvent );
       
   374             }
       
   375         }
       
   376     }
       
   377 
       
   378 // ---------------------------------------------------------------------------
       
   379 // CWlanBgScanStates::StateChangeOffToOn
       
   380 // ---------------------------------------------------------------------------
       
   381 //
       
   382 void CWlanBgScanStates::StateChangeOffToOn( TWlanBgScanState& aState, TUint32 aNewBgScanInterval )
       
   383     {
       
   384     aState = EBgScanOn;
       
   385     SetInterval( aNewBgScanInterval );
       
   386     }
       
   387 
       
   388 // ---------------------------------------------------------------------------
       
   389 // CWlanBgScanStates::StateChangeOffToAutomatic
       
   390 // ---------------------------------------------------------------------------
       
   391 //
       
   392 void CWlanBgScanStates::StateChangeOffToAutomatic( TWlanBgScanState& aState )
       
   393     {
       
   394     if ( iBgScan.AwsPresence() == CWlanBgScan::EAwsPresent )
       
   395         {
       
   396         DEBUG( "CWlanBgScanStates::StateChangeOffToAutomatic() - state change Off to SendingAwsCmd" );
       
   397         aState = EBgScanSendingAwsCmd;
       
   398         DEBUG( "CWlanBgScanStates::InStaStateChangeOffToAutomaticteOff() - if command sending succeeds, next state is AutoAws" );
       
   399         iNextState = EBgScanAutoAws;
       
   400         MWlanBgScanAwsComms::TAwsMessage msg = { MWlanBgScanAwsComms::EStart, 0 };
       
   401         iBgScan.AwsCommand( msg );
       
   402         DEBUG( "CWlanBgScanStates::StateChangeOffToAutomatic() - SendOrQueueAwsCommand() returned" );
       
   403         }
       
   404     else
       
   405         {
       
   406         DEBUG( "CWlanBgScanStates::StateChangeOffToAutomatic() - state change Off to Auto" );
       
   407         DEBUG( "CWlanBgScanStates::StateChangeOffToAutomatic() - determine next interval change time and request callback" );
       
   408         aState = EBgScanAuto;
       
   409         iBgScan.ScheduleAutoIntervalChange();
       
   410         SetInterval( iBgScan.CurrentAutoInterval() );
       
   411         }
       
   412     }
       
   413 // ---------------------------------------------------------------------------
       
   414 // CWlanBgScanStates::InStateOn
       
   415 // ---------------------------------------------------------------------------
       
   416 //
       
   417 void CWlanBgScanStates::InStateOn( TWlanBgScanState& aState, const CWlanBgScanStates::TWlanBgScanSmEvent& aEvent )
       
   418     {
       
   419     switch( aEvent )
       
   420         {
       
   421         case CWlanBgScanStates::EBgScanEventIntervalChanged:
       
   422             {
       
   423             DEBUG( "CWlanBgScanStates::InStateOn() - event: EBgScanEventIntervalChanged" );
       
   424             switch( iBgScanSettings.backgroundScanInterval )
       
   425                 {
       
   426                 case KWlanBgScanIntervalNever:
       
   427                     {
       
   428                     DEBUG( "CWlanBgScanStates::InStateOn() - state change On to Off" );
       
   429                     StateChangeOnToOff( aState );
       
   430                     break;
       
   431                     }
       
   432                 case KWlanBgScanIntervalAutomatic:
       
   433                     {
       
   434                     DEBUG( "CWlanBgScanStates::InStateOn() - state change On to Auto" );
       
   435                     StateChangeOnToAutomatic( aState );
       
   436                     break;
       
   437                     }
       
   438                 default:
       
   439                     {
       
   440                     DEBUG( "CWlanBgScanStates::InStateOn() - state change On to On" );
       
   441                     StateChangeOnToOn( aState, iBgScanSettings.backgroundScanInterval );
       
   442                     }
       
   443                 }
       
   444             break;
       
   445             }
       
   446         default:
       
   447             {
       
   448             DEBUG1( "CWlanBgScanStates::InStateOn() - event %d ignored", aEvent );
       
   449             }
       
   450         }
       
   451     }
       
   452 
       
   453 // ---------------------------------------------------------------------------
       
   454 // CWlanBgScanStates::StateChangeOnToOn
       
   455 // ---------------------------------------------------------------------------
       
   456 //
       
   457 void CWlanBgScanStates::StateChangeOnToOn( TWlanBgScanState& aState, TUint32 aNewBgScanSetting  )
       
   458     {
       
   459     aState = EBgScanOn;
       
   460     SetInterval( aNewBgScanSetting );
       
   461     }
       
   462 
       
   463 // ---------------------------------------------------------------------------
       
   464 // CWlanBgScanStates::StateChangeOnToAutomatic
       
   465 // ---------------------------------------------------------------------------
       
   466 //
       
   467 void CWlanBgScanStates::StateChangeOnToAutomatic( TWlanBgScanState& aState )
       
   468     {
       
   469     if ( iBgScan.AwsPresence() == CWlanBgScan::EAwsPresent )
       
   470         {
       
   471         DEBUG( "CWlanBgScanStates::StateChangeOnToAutomatic() - state change Init to SendingAwsCmd" );
       
   472         aState = EBgScanSendingAwsCmd;
       
   473         DEBUG( "CWlanBgScanStates::StateChangeOnToAutomatic() - if command sending succeeds, next state is AutoAws" );
       
   474         iNextState = EBgScanAutoAws;
       
   475         MWlanBgScanAwsComms::TAwsMessage msg = { MWlanBgScanAwsComms::EStart, 0 };
       
   476         iBgScan.AwsCommand( msg );
       
   477         DEBUG( "CWlanBgScanStates::StateChangeOnToAutomatic() - SendOrQueueAwsCommand() returned" );
       
   478         }
       
   479     else
       
   480         {
       
   481         aState = EBgScanAuto;
       
   482         iBgScan.ScheduleAutoIntervalChange();
       
   483         SetInterval( iBgScan.CurrentAutoInterval() );        
       
   484         }
       
   485     }
       
   486 
       
   487 // ---------------------------------------------------------------------------
       
   488 // CWlanBgScanStates::StateChangeOnToOff
       
   489 // ---------------------------------------------------------------------------
       
   490 //
       
   491 void CWlanBgScanStates::StateChangeOnToOff( TWlanBgScanState& aState )
       
   492     {
       
   493     aState = EBgScanOff;
       
   494     SetInterval( KWlanBgScanIntervalNever );
       
   495     }
       
   496 
       
   497 // ---------------------------------------------------------------------------
       
   498 // CWlanBgScanStates::InStateAuto
       
   499 // ---------------------------------------------------------------------------
       
   500 //
       
   501 void CWlanBgScanStates::InStateAuto( TWlanBgScanState& aState, const CWlanBgScanStates::TWlanBgScanSmEvent& aEvent )
       
   502     {
       
   503     switch( aEvent )
       
   504         {
       
   505         case CWlanBgScanStates::EBgScanEventIntervalChanged:
       
   506             {
       
   507             DEBUG( "CWlanBgScanStates::InStateAuto() - event: EBgScanEventIntervalChanged" );
       
   508             switch( iBgScanSettings.backgroundScanInterval )
       
   509                 {
       
   510                 case KWlanBgScanIntervalNever:
       
   511                     {
       
   512                     DEBUG( "CWlanBgScanStates::InStateAuto() - state change Auto to Off" );
       
   513                     StateChangeAutoToOff( aState );
       
   514                     break;
       
   515                     }
       
   516                 case KWlanBgScanIntervalAutomatic:
       
   517                     {
       
   518                     DEBUG( "CWlanBgScanStates::InStateAuto() - state still Auto" );
       
   519                     StateChangeAutoToAuto( aState );
       
   520                     break;
       
   521                     }
       
   522                 default:
       
   523                     {
       
   524                     DEBUG( "CWlanBgScanStates::InStateAuto() - state change Auto to On" );
       
   525                     StateChangeAutoToOn( aState, iBgScanSettings.backgroundScanInterval );
       
   526                     }
       
   527                 }
       
   528             break;
       
   529             }
       
   530         default:
       
   531             {
       
   532             DEBUG1( "CWlanBgScanStates::InStateAuto() - event %d ignored", aEvent );
       
   533             }
       
   534         }
       
   535     }
       
   536 
       
   537 // ---------------------------------------------------------------------------
       
   538 // CWlanBgScanStates::StateChangeAutoToOff
       
   539 // ---------------------------------------------------------------------------
       
   540 //
       
   541 void CWlanBgScanStates::StateChangeAutoToOff( TWlanBgScanState& aState )
       
   542     {
       
   543     aState = EBgScanOff;
       
   544     iTimerServices.StopTimer( iIntervalChangeRequestId );
       
   545     iIntervalChangeRequestId = 0;
       
   546     SetInterval( KWlanBgScanIntervalNever );
       
   547     }
       
   548 
       
   549 // ---------------------------------------------------------------------------
       
   550 // CWlanBgScanStates::StateChangeAutoToAuto
       
   551 // ---------------------------------------------------------------------------
       
   552 //
       
   553 void CWlanBgScanStates::StateChangeAutoToAuto( TWlanBgScanState& aState )
       
   554     {
       
   555     aState = EBgScanAuto;
       
   556     iBgScan.ScheduleAutoIntervalChange();
       
   557     SetInterval( iBgScan.CurrentAutoInterval() );
       
   558     }
       
   559 
       
   560 // ---------------------------------------------------------------------------
       
   561 // CWlanBgScanStates::StateChangeAutoToOn
       
   562 // ---------------------------------------------------------------------------
       
   563 //
       
   564 void CWlanBgScanStates::StateChangeAutoToOn( TWlanBgScanState& aState, TUint32 aNewBgScanSetting  )
       
   565     {
       
   566     aState = EBgScanOn;
       
   567     iTimerServices.StopTimer( iIntervalChangeRequestId );
       
   568     iIntervalChangeRequestId = 0;
       
   569     SetInterval( aNewBgScanSetting );
       
   570     }
       
   571 
       
   572 // ---------------------------------------------------------------------------
       
   573 // CWlanBgScanStates::InStateAutoAws
       
   574 // ---------------------------------------------------------------------------
       
   575 //
       
   576 void CWlanBgScanStates::InStateAutoAws( TWlanBgScanState& aState, const CWlanBgScanStates::TWlanBgScanSmEvent& aEvent )
       
   577     {
       
   578     switch( aEvent )
       
   579         {
       
   580         case CWlanBgScanStates::EBgScanEventIntervalChanged:
       
   581             {
       
   582             DEBUG( "CWlanBgScanStates::InStateAutoAws() - event: EBgScanEventIntervalChanged" );
       
   583             switch( iBgScanSettings.backgroundScanInterval )
       
   584                 {
       
   585                 case KWlanBgScanIntervalNever:
       
   586                     {
       
   587                     DEBUG( "CWlanBgScanStates::InStateAutoAws() - state change AutoAws to Off" );
       
   588                     StateChangeAutoAwsToOff( aState );
       
   589                     break;
       
   590                     }
       
   591                 case KWlanBgScanIntervalAutomatic:
       
   592                     {
       
   593                     DEBUG( "CWlanBgScanStates::InStateAutoAws() - no change in the interval" );
       
   594                     aState = EBgScanAutoAws;
       
   595                     break;
       
   596                     }
       
   597                 default:
       
   598                     {
       
   599                     DEBUG( "CWlanBgScanStates::InStateAutoAws() - state change AutoAws to On" );
       
   600                     StateChangeAutoAwsToOn( aState );
       
   601                     }
       
   602                 }
       
   603             break;
       
   604             }
       
   605         case CWlanBgScanStates::EBgScanEventAwsIntervalChanged:
       
   606             {
       
   607             DEBUG( "CWlanBgScanStates::InStateAutoAws() - event: EBgScanEventAwsIntervalChanged" );
       
   608             SetInterval( AutoInterval() );
       
   609             break;
       
   610             }
       
   611         default:
       
   612             {
       
   613             DEBUG1( "CWlanBgScanStates::InStateAutoAws() - event %d ignored", aEvent );
       
   614             }
       
   615         }
       
   616     }
       
   617 
       
   618 // ---------------------------------------------------------------------------
       
   619 // CWlanBgScanStates::StateChangeAutoAwsToOff
       
   620 // ---------------------------------------------------------------------------
       
   621 //
       
   622 void CWlanBgScanStates::StateChangeAutoAwsToOff( TWlanBgScanState& aState )
       
   623     {
       
   624     aState = EBgScanSendingAwsCmd;
       
   625     iNextState = EBgScanOff;
       
   626     DEBUG( "CWlanBgScanStates::StateChangeAutoAwsToOff() - calling SendOrQueueAwsCommand()" );
       
   627     MWlanBgScanAwsComms::TAwsMessage msg = { MWlanBgScanAwsComms::EStop, 0 };
       
   628     iBgScan.AwsCommand( msg );
       
   629     DEBUG( "CWlanBgScanStates::StateChangeAutoAwsToOff() - SendOrQueueAwsCommand() returned" );
       
   630     iProvider.CancelScan();
       
   631     }
       
   632 
       
   633 // ---------------------------------------------------------------------------
       
   634 // CWlanBgScanStates::StateChangeAutoAwsToOn
       
   635 // ---------------------------------------------------------------------------
       
   636 //
       
   637 void CWlanBgScanStates::StateChangeAutoAwsToOn( TWlanBgScanState& aState )
       
   638     {
       
   639     aState = EBgScanSendingAwsCmd;
       
   640     iNextState = EBgScanOn;
       
   641     DEBUG( "CWlanBgScanStates::StateChangeAutoAwsToOn() - calling SendAwsCommand()" );
       
   642     MWlanBgScanAwsComms::TAwsMessage msg = { MWlanBgScanAwsComms::EStop, 0 };
       
   643     iBgScan.AwsCommand( msg );
       
   644     DEBUG( "CWlanBgScanStates::StateChangeAutoAwsToOn() - SendAwsCommand() returned" );
       
   645     }
       
   646 
       
   647 // ---------------------------------------------------------------------------
       
   648 // CWlanBgScanStates::InStateSendingAwsCmd
       
   649 // ---------------------------------------------------------------------------
       
   650 //
       
   651 void CWlanBgScanStates::InStateSendingAwsCmd( TWlanBgScanState& aState, const CWlanBgScanStates::TWlanBgScanSmEvent& aEvent )
       
   652     {
       
   653     DEBUG1( "CWlanBgScanStates::InStateSendingAwsCmd() - event: %d", aEvent );
       
   654 
       
   655     switch( aEvent )
       
   656         {
       
   657         case CWlanBgScanStates::EBgScanEventAwsCmdComplete:
       
   658             {
       
   659             DEBUG( "CWlanBgScanStates::InStateSendingAwsCmd() - event: EBgScanEventAwsCmdComplete" );
       
   660             switch( AwsCmdStatus() )
       
   661                 {
       
   662                 case KErrNone:
       
   663                     {
       
   664                     DEBUG( "CWlanBgScanStates::InStateSendingAwsCmd() - AWS command sending successful" );
       
   665                     switch ( iNextState )
       
   666                         {
       
   667                         case EBgScanOff:
       
   668                             {
       
   669                             ASSERT( AwsCmd() == MWlanBgScanAwsComms::EStop );
       
   670                             DEBUG( "CWlanBgScanStates::InStateSendingAwsCmd() - state change SendingAwsCmd to Off" );
       
   671                             StateChangeSendingAwsCmdToOff( aState );
       
   672                             break;
       
   673                             }
       
   674                         case EBgScanOn:
       
   675                             {
       
   676                             ASSERT( AwsCmd() == MWlanBgScanAwsComms::EStop );
       
   677                             DEBUG( "CWlanBgScanStates::InStateSendingAwsCmd() - state change SendingAwsCmd to On" );
       
   678                             StateChangeSendingAwsCmdToOn( aState );
       
   679                             break;
       
   680                             }
       
   681                         case EBgScanAutoAws:
       
   682                             {
       
   683                             ASSERT( AwsCmd() == MWlanBgScanAwsComms::EStart );
       
   684                             DEBUG( "CWlanBgScanStates::InStateSendingAwsCmd() - state change SendingAwsCmd to AutoAws" );
       
   685                             StateChangeSendingAwsCmdToAutoAws( aState );
       
   686                             break;
       
   687                             }
       
   688                         default:
       
   689                             {
       
   690                             DEBUG1( "CWlanBgScanStates::InStateSendingAwsCmd() - illegal state change from SendingAwsCmd to %u", iNextState );
       
   691                             ASSERT( 0 );
       
   692                             }
       
   693                         }
       
   694                     break;
       
   695                     }
       
   696                 default:
       
   697                     {
       
   698                     DEBUG2( "CWlanBgScanStates::InStateSendingAwsCmd() - AWS command %d sending failed! Status %d", AwsCmd(), AwsCmdStatus() );
       
   699                     switch ( iNextState )
       
   700                         {
       
   701                         case EBgScanOff:
       
   702                             {
       
   703                             DEBUG( "CWlanBgScanStates::InStateSendingAwsCmd() - state change SendingAwsCmd to Off" );
       
   704                             StateChangeSendingAwsCmdToOff( aState );
       
   705                             break;
       
   706                             }
       
   707                         case EBgScanOn:
       
   708                             {
       
   709                             DEBUG( "CWlanBgScanStates::InStateSendingAwsCmd() - state change SendingAwsCmd to On" );
       
   710                             StateChangeSendingAwsCmdToOn( aState );
       
   711                             break;
       
   712                             }
       
   713                         case EBgScanAutoAws:
       
   714                             {
       
   715                             DEBUG( "CWlanBgScanStates::InStateSendingAwsCmd() - state change SendingAwsCmd to Auto" );
       
   716                             StateChangeSendingAwsCmdToAuto( aState );
       
   717                             break;
       
   718                             }
       
   719                         default:
       
   720                             {
       
   721                             DEBUG1( "CWlanBgScanStates::InStateSendingAwsCmd() - illegal state change from SendingAwsCmd to %u", iNextState );
       
   722                             ASSERT( 0 );
       
   723                             }
       
   724                         }
       
   725                     break;
       
   726                     }
       
   727                 }
       
   728             break;
       
   729             }
       
   730         default:
       
   731             {
       
   732             DEBUG1( "CWlanBgScanStates::InStateSendingAwsCmd() - event %d ignored", aEvent );
       
   733             }
       
   734         }
       
   735     }
       
   736 
       
   737 // ---------------------------------------------------------------------------
       
   738 // CWlanBgScanStates::StateChangeInitToAutoAws
       
   739 // ---------------------------------------------------------------------------
       
   740 //
       
   741 void CWlanBgScanStates::StateChangeInitToAutoAws( TWlanBgScanState& aState )
       
   742     {
       
   743     if ( iBgScan.AwsPresence() == CWlanBgScan::EAwsPresent )
       
   744         {
       
   745         DEBUG( "CWlanBgScanStates::StateChangeInitToAutoAws() - state change Init to SendingAwsCmd" );
       
   746         aState = EBgScanSendingAwsCmd;
       
   747         DEBUG( "CWlanBgScanStates::StateChangeInitToAutoAws() - if command sending succeeds, next state is AutoAws" );
       
   748         iNextState = EBgScanAutoAws;
       
   749         MWlanBgScanAwsComms::TAwsMessage msg = { MWlanBgScanAwsComms::EStart, 0 };
       
   750         iBgScan.AwsCommand( msg );
       
   751         DEBUG( "CWlanBgScanStates::StateChangeInitToAutoAws() - SendOrQueueAwsCommand() returned" );
       
   752         }
       
   753     else
       
   754         {
       
   755         DEBUG( "CWlanBgScanStates::StateChangeInitToAutoAws() - error: AWS not present!" );
       
   756         ASSERT( 0 );
       
   757         DEBUG( "CWlanBgScanStates::StateChangeInitToAutoAws() - state change Init to Auto" );
       
   758         aState = EBgScanAuto;
       
   759         DEBUG( "CWlanBgScanStates::StateChangeInitToAutoAws() - * determine next interval change time and request callback" );
       
   760         iBgScan.ScheduleAutoIntervalChange();
       
   761         SetInterval( iBgScan.CurrentAutoInterval() );
       
   762         }
       
   763     }
       
   764 
       
   765 // ---------------------------------------------------------------------------
       
   766 // CWlanBgScanStates::StateChangeSendingAwsCmdToOff
       
   767 // ---------------------------------------------------------------------------
       
   768 //
       
   769 void CWlanBgScanStates::StateChangeSendingAwsCmdToOff( TWlanBgScanState& aState )
       
   770     {
       
   771     DEBUG( "CWlanBgScanStates::StateChangeSendingAwsCmdToOff()" );
       
   772     aState = EBgScanOff;
       
   773     SetInterval( KWlanBgScanIntervalNever );
       
   774     }
       
   775 
       
   776 // ---------------------------------------------------------------------------
       
   777 // CWlanBgScanStates::StateChangeSendingAwsCmdToOn
       
   778 // ---------------------------------------------------------------------------
       
   779 //
       
   780 void CWlanBgScanStates::StateChangeSendingAwsCmdToOn( TWlanBgScanState& aState )
       
   781     {
       
   782     DEBUG( "CWlanBgScanStates::StateChangeSendingAwsCmdToOn()" );
       
   783     aState = EBgScanOn;
       
   784     SetInterval( iBgScanSettings.backgroundScanInterval );
       
   785     }
       
   786 
       
   787 // ---------------------------------------------------------------------------
       
   788 // CWlanBgScanStates::StateChangeSendingAwsCmdToAuto
       
   789 // ---------------------------------------------------------------------------
       
   790 //
       
   791 void CWlanBgScanStates::StateChangeSendingAwsCmdToAuto( TWlanBgScanState& aState )
       
   792     {
       
   793     DEBUG( "CWlanBgScanStates::StateChangeSendingAwsCmdToAuto()" );
       
   794     aState = EBgScanAuto;
       
   795     DEBUG( "CWlanBgScanStates::StateChangeSendingAwsCmdToAuto() - * determine next interval change time and request callback" );
       
   796     iBgScan.ScheduleAutoIntervalChange();
       
   797     SetInterval( iBgScan.CurrentAutoInterval() );
       
   798     }
       
   799 
       
   800 // ---------------------------------------------------------------------------
       
   801 // CWlanBgScanStates::StateChangeSendingAwsCmdToAutoAws
       
   802 // ---------------------------------------------------------------------------
       
   803 //
       
   804 void CWlanBgScanStates::StateChangeSendingAwsCmdToAutoAws( TWlanBgScanState& aState )
       
   805     {
       
   806     DEBUG( "CWlanBgScanStates::StateChangeSendingAwsCmdToAutoAws()" );
       
   807     aState = EBgScanAutoAws;
       
   808     SetInterval( AutoInterval() );
       
   809     }
       
   810 
       
   811 // ---------------------------------------------------------------------------
       
   812 // CWlanBgScanStates::SetInterval
       
   813 // ---------------------------------------------------------------------------
       
   814 //
       
   815 void CWlanBgScanStates::SetInterval( TUint32 aInterval )
       
   816     {
       
   817     DEBUG2( "CWlanBgScanStates::SetInterval() - current: %u, new: %u", iBgScanInterval, aInterval );
       
   818 
       
   819     if( aInterval == KWlanBgScanIntervalNever )
       
   820         {
       
   821         iBgScanInterval = KWlanNoScanning;
       
   822         }
       
   823     else
       
   824         {
       
   825         iBgScanInterval = aInterval;
       
   826         }
       
   827     
       
   828     RefreshUsedInterval();
       
   829     }
       
   830 
       
   831 // ---------------------------------------------------------------------------
       
   832 // CWlanBgScanStates::RefreshUsedInterval
       
   833 // ---------------------------------------------------------------------------
       
   834 //
       
   835 void CWlanBgScanStates::RefreshUsedInterval()
       
   836     {
       
   837     TUint oldInterval = iUsedBgScanInterval;
       
   838     
       
   839     DEBUG2( "CWlanBgScanStates::RefreshUsedInterval() - agg: %u, normal: %u",
       
   840         iAggressiveBgScanInterval, iBgScanInterval );
       
   841     
       
   842     // Smaller of the two intervals will be taken into use
       
   843     if( iAggressiveBgScanInterval < iBgScanInterval )
       
   844         {
       
   845         iUsedBgScanInterval = iAggressiveBgScanInterval;
       
   846         }
       
   847     else
       
   848         {
       
   849         iUsedBgScanInterval = iBgScanInterval;
       
   850         }
       
   851     
       
   852     // If the interval changed, update it to P&S
       
   853     if( iUsedBgScanInterval != oldInterval )
       
   854         {
       
   855         DEBUG2( "CWlanBgScanStates::RefreshUsedInterval() - used interval changed (new: %u, old: %u), publish it via P&S",
       
   856             iUsedBgScanInterval, oldInterval );
       
   857         TUint32 interval = GetBgInterval();
       
   858         iProvider.PublishBgScanInterval( interval );
       
   859         }
       
   860    
       
   861     // Check if scanning has to be cancelled or carried out immediately
       
   862     if( KWlanNoScanning == iUsedBgScanInterval )
       
   863         {
       
   864         DEBUG( "CWlanBgScanStates::RefreshUsedInterval() - scanning disabled, cancel pending scan" );
       
   865         // In case scanning was disabled, cancel the pending scan request
       
   866         iProvider.CancelScan();
       
   867         }
       
   868     else if( iUsedBgScanInterval < oldInterval )
       
   869         {
       
   870         DEBUG( "CWlanBgScanStates::RefreshUsedInterval() - new interval smaller than the old one, scan immediately" );
       
   871         // In case the new interval is smaller than the old one, scan
       
   872         // immediately
       
   873         iProvider.CancelScan();
       
   874         iProvider.Scan( KWlanBgScanMaxDelayExpireImmediately );
       
   875         }
       
   876     // else
       
   877         // In case the new interval is bigger than the old one, it
       
   878         // is taken into use after the pending scan request completes.
       
   879     }
       
   880 
       
   881     
       
   882