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