callcontinuity/vcchotrigger/src/vccwlansignallevelhandler.cpp
branchRCL_3
changeset 21 f742655b05bf
parent 20 65a3ef1d5bd0
child 22 d38647835c2e
--- a/callcontinuity/vcchotrigger/src/vccwlansignallevelhandler.cpp	Thu Aug 19 09:45:22 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,442 +0,0 @@
-/*
-* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:   Implementation of the WLAN signal level handler
-*
-*/
-
-
-
-#include <wlanmgmtclient.h>
-#include "vccwlansignallevelhandler.h"
-#include "rubydebug.h"
-#include "vccengpsproperty.h"
-#include <ccpdefs.h>
-
-// Min. signal strength.
-static const TInt32 KStrengthMin = 110;
-
-const TInt KWlanPollIntervalLowSignal= 1000000;
-const TInt KWlanPollIntervalHighSignal= 5000000;
-
-// ---------------------------------------------------------------------------
-// C++ destructor.
-// ---------------------------------------------------------------------------
-//
-CVccWlanSignalLevelHandler::~CVccWlanSignalLevelHandler()
-    {
-    // Cancel any request, if outstanding
-    Cancel();
-#ifndef __WINS__
-    delete iWlanMgmt;
-#endif
-    }
-
-// ---------------------------------------------------------------------------
-// Symbian constructor.
-// ---------------------------------------------------------------------------
-//
-CVccWlanSignalLevelHandler* CVccWlanSignalLevelHandler::NewL(
-    MVccSignalLevelObserver& aObserver,
-    const TSignalLevelParams& aParams, CVccEngPsProperty& aPsProperty )
-    {
-    CVccWlanSignalLevelHandler* self =
-        CVccWlanSignalLevelHandler::NewLC( aObserver, aParams, aPsProperty );
-
-    CleanupStack::Pop( self );
-
-    return self;
-    }
-
-// ---------------------------------------------------------------------------
-// Symbian constructor.
-// ---------------------------------------------------------------------------
-//
-CVccWlanSignalLevelHandler* CVccWlanSignalLevelHandler::NewLC(
-    MVccSignalLevelObserver& aObserver,
-    const TSignalLevelParams& aParams, CVccEngPsProperty& aPsProperty )
-    {
-    CVccWlanSignalLevelHandler * self =
-        new ( ELeave ) CVccWlanSignalLevelHandler( aObserver, aParams, aPsProperty );
-
-    CleanupStack::PushL( self );
-    self->ConstructL();
-    return self;
-    }
-
-// ---------------------------------------------------------------------------
-// C++ constructor.
-// ---------------------------------------------------------------------------
-//
-CVccWlanSignalLevelHandler::CVccWlanSignalLevelHandler(
-    MVccSignalLevelObserver& aObserver,
-    const TSignalLevelParams& aParams, CVccEngPsProperty& aPsProperty )
-    : CVccSignalLevelHandler( aObserver, aParams ), iVccPsp( aPsProperty )
-    {
-    iManualHoDone = EFalse;
-    }
-
-// ---------------------------------------------------------------------------
-// Symbian second-phase constructor.
-// ---------------------------------------------------------------------------
-//
-void CVccWlanSignalLevelHandler::ConstructL()
-    {
-    RUBY_DEBUG_BLOCKL( "CVccWlanSignalLevelHandler::ConstructL" );
-
-    CVccSignalLevelHandler::ConstructL();
-#ifndef __WINS__
-    //WlanMgmtClient is not started when the phone is not f. ex. labeled
-    TRAP_IGNORE( iWlanMgmt = CWlanMgmtClient::NewL() );
-#endif
-    }
-
-// ---------------------------------------------------------------------------
-// Enable notifications.
-// ---------------------------------------------------------------------------
-//
-void CVccWlanSignalLevelHandler::EnableNotificationsL()
-    {
-    RUBY_DEBUG_BLOCK( "CVccWlanSignalLevelHandler::EnableNotificationsL" );
-#ifndef __WINS__
-    if( iWlanMgmt )
-        {
-        TInt error = iWlanMgmt->UpdateRssNotificationBoundary(
-            iParams.iLowLevel,
-            iParams.iLowLevel - iParams.iHighLevel );
-
-        User::LeaveIfError( error );
-
-        iWlanMgmt->ActivateNotificationsL( *this );
-        }
-#endif
-    }
-
-// ---------------------------------------------------------------------------
-// Disable notifications.
-// ---------------------------------------------------------------------------
-//
-void CVccWlanSignalLevelHandler::DisableNotifications()
-    {
-    RUBY_DEBUG_BLOCK( "CVccWlanSignalLevelHandler::DisableNotificationsL" );
-#ifndef __WINS__
-    if( iWlanMgmt )
-        {
-        iWlanMgmt->CancelNotifications();
-        }
-#endif
-    }
-
-// ---------------------------------------------------------------------------
-// Get signal strength.
-// ---------------------------------------------------------------------------
-//
-void CVccWlanSignalLevelHandler::GetStrength()
-    {
-
-    RUBY_DEBUG_BLOCK( "CVccWlanSignalLevelHandler::GetStrength" );
-
-    iStrength = KStrengthMin;
-#ifndef __WINS__
-    if( iWlanMgmt )
-        {
-        iWlanMgmt->GetConnectionSignalQuality( iStrength );
-        }
-#endif
-    RUBY_DEBUG1( " -strength = %d", iStrength );
-
-    // Because the RMobilePhone used in GSM is asynchronous we need here
-    // to signal that the request is complete (in order to continue
-    // processing stuff in RunL)
-
-    TRequestStatus *sP = &iStatus;
-
-    User::RequestComplete( sP, KErrNone );
-    }
-
-// ---------------------------------------------------------------------------
-// Cancel outstanding GetStrength.
-// We do not need to do anything since WLAN GetStrength is synchronous.
-// ---------------------------------------------------------------------------
-//
-void CVccWlanSignalLevelHandler::CancelGetStrength()
-    {
-    RUBY_DEBUG_BLOCK( "CVccWlanSignalLevelHandler::CancelGetStrength" );
-    }
-
-// ---------------------------------------------------------------------------
-// Handles indication of changed RSS value.
-// ---------------------------------------------------------------------------
-//
-void CVccWlanSignalLevelHandler::RssChanged( TWlanRssClass aRssClass, TUint aRss )
-    {
-    RUBY_DEBUG_BLOCK( "CVccWlanSignalLevelHandler::RssChanged" );
-    RUBY_DEBUG2( " -class = %d rss = %d", aRssClass, aRss);
-
-    // Do some basic check
-    // Zero (0) is not acceptable strength (too good?).
-
-    iStrength = aRss ? aRss : KStrengthMin;
-    StrengthChanged();
-    }
-
-// ---------------------------------------------------------------------------
-// Handles BSSID has changed (i.e. AP handover) situation.
-// ---------------------------------------------------------------------------
-//
-void CVccWlanSignalLevelHandler::BssidChanged( TWlanBssid& aNewBSSID )
-    {
-    RUBY_DEBUG_BLOCK( "CVccWlanSignalLevelHandler::BssidChanged" );
-    RUBY_DEBUG1( " -aNewBSSID = %S", &aNewBSSID );
-
-    iStrength = KStrengthMin;
-#ifndef __WINS__
-    if( iWlanMgmt )
-        {
-        iWlanMgmt->GetConnectionSignalQuality( iStrength );
-        }
-#endif
-
-    StrengthChanged();
-    }
-
-// ---------------------------------------------------------------------------
-//  Handles lost of one or more networks
-// ---------------------------------------------------------------------------
-//
-void CVccWlanSignalLevelHandler::OldNetworksLost()
-    {
-    RUBY_DEBUG_BLOCK( "CVccWlanSignalLevelHandler::OldNetworksLost" );
-
-    iStrength = KStrengthMin;
-#ifndef __WINS__
-    if( iWlanMgmt )
-        {
-        iWlanMgmt->GetConnectionSignalQuality( iStrength );
-        }
-#endif
-    StrengthChanged();
-    
-    TVccHoStatus hoStatus( EVccHoStateUnknown );
-    iVccPsp.GetCurrentHoStatus( hoStatus );
-    
-    RUBY_DEBUG1("Current HoStatus; %d", hoStatus);
-    
-    if( hoStatus == EVccCsToPsHoStarted || hoStatus == EVccCsToPsHoInprogress 
-                                         || hoStatus == EVccHoUnavailable )
-        {
-        iVccPsp.NotifySubscriberL( EVccCsToPsHoFailure, ECCPErrorNetworkOutOfOrder );
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// Notify observer that the signal level has been changed.
-// ---------------------------------------------------------------------------
-//
-void CVccWlanSignalLevelHandler::NotifyChanges(
-    TInt32 aSignalStrength,
-    MVccSignalLevelObserver::TSignalStrengthClass aClass )
-    {
-    RUBY_DEBUG_BLOCK( "CVccWlanSignalLevelHandler::NotifyChanges" );
-    RUBY_DEBUG1( " -New strength = -%d dBm", aSignalStrength );
-
-    iObserver.WlanSignalChanged( aSignalStrength, aClass );
-    }
-
-
-// ---------------------------------------------------------------------------
-// Handles getting the signal strength and notifying the observer about
-// strength changes.
-// ---------------------------------------------------------------------------
-
-void CVccWlanSignalLevelHandler::RunL()
-    {
-    RUBY_DEBUG_BLOCK( "CVccWlanSignalLevelHandler::RunL" );
-
-    // Zero (0) is not acceptable.
-       if ( !iStrength )
-           {
-           RUBY_DEBUG0( " -0 strength not acceptable, setting to KStrengthMin");
-           iStrength = KStrengthMin;
-           }
-
-       RUBY_DEBUG3( " -iStrength = %d iState = %d iOp = %d", iStrength, iState, iOperation );
-
-       switch ( iOperation )
-           {
-           case EOperationGet:
-               {
-
-               // We are in the Get-mode to get the signal strength.
-               // If the strength is < than the high level (== the strength
-               // is good), start timer to check if we are still in good level
-               // after the timer completes.
-               // The same is done if we have a low level (== bad).
-
-               RUBY_DEBUG0( " -EOperationGet");
-
-               if ( iStrength <= iParams.iHighLevel && iStrength > 0 )
-                   {
-                   RUBY_DEBUG0( "  set state = EStrengthHigh, op = EOperationWait" );
-                   
-                   After( iParams.iHighTimeout );
-                   iState = EStrengthHigh;
-                   iOperation = EOperationWait;
-                   }
-               else if ( iStrength >= iParams.iLowLevel )
-                   {
-                   RUBY_DEBUG0( "  set state = EStrengtLow, op = EOperationWait" );
-                   After( iParams.iLowTimeout );
-                   iState = EStrengthLow;
-                   iOperation = EOperationWait;
-                   }
-               else
-                   {
-                   RUBY_DEBUG0( "  strength between low and high, set op = EOperationNone" );
-                  
-                   //WLAN signal is almost weak, check again with low interval
-                   After( KWlanPollIntervalLowSignal );
-                   iOperation = EOperationNone;
-                   iState = EStrengthLow;
-                   // PCLint
-                   }
-               break;
-               }
-
-           case EOperationWait:
-               {
-
-               // Timer has completed. Check the signal level again.
-
-               RUBY_DEBUG0( " -EOperationWait" );
-               RUBY_DEBUG0( "  set op = EOperationComplete" );
-               GetStrength();
-
-               SetActive();
-
-               iOperation = EOperationComplete;
-
-               break;
-               }
-
-           case EOperationComplete:
-               {
-               // Checking signal strength is now done.
-               // Notify our observer (if needed).
-
-               RUBY_DEBUG1( " -EOperationComplete, iStrength = %d", iStrength );
-
-               // Do we have a good signal level?
-               if ( iStrength <= iParams.iHighLevel && iStrength > 0 && iState == EStrengthHigh )
-                   {
-                   RUBY_DEBUG0( " -if ( iStrength <= iParams.iHighLevel" );
-                   NotifyChanges( iStrength, MVccSignalLevelObserver::ESignalClassNormal );
-                   }
-               // Or do we have a bad signal level?
-               else if ( iStrength >= iParams.iHighLevel && iState == EStrengthLow )
-                   {
-                   RUBY_DEBUG0( " -else if ( iStrength >= iParams.iHighLevel" );
-                   NotifyChanges( iStrength, MVccSignalLevelObserver::ESignalClassWeak );
-                   }
-               else
-                   {
-                   // PCLint
-                   }
-               
-               TTimeIntervalMicroSeconds32 interval;
-                                              
-                    if( iState == EStrengthHigh )
-                        {
-                         RUBY_DEBUG0( "  high interval" );
-                        interval = KWlanPollIntervalHighSignal;
-                         }
-                    else
-                          {
-                          RUBY_DEBUG0( "  low interval" )
-                           interval = KWlanPollIntervalLowSignal;
-                          }
-                               
-                    After( interval );
-       
-               iState = EStrengthUnknown;
-               iOperation = EOperationNone;
-             
-               break;
-               }
-
-           case EOperationNone:
-               {
-               RUBY_DEBUG0( " -EOperationNone" );
-               
-               //if manual HO is done then there is no need for checking signal strength so much,
-               //so stopping the loop
-               if( !iManualHoDone )
-                   {
-                   RUBY_DEBUG0( " -call GetStrength()" );
-                   GetStrength();
-                   SetActive();
-                   RUBY_DEBUG1( " -iStrength = %d, set op = EOperationGet \
-                                        state = EStrengthUnknown", iStrength );
-                   iOperation = EOperationGet;
-                   }
-                break;
-         
-               }
-               
-                
-           default:
-               {
-               break;
-               }
-           }
-       
-    }
-
-// ---------------------------------------------------------------------------
-// Lets Wlan Signal Level Handler know is manual handover done or not done
-// 
-// ---------------------------------------------------------------------------
-
-
-void CVccWlanSignalLevelHandler::SetManualHoDone( TBool aValue )
-    {
-    RUBY_DEBUG_BLOCK( "CVccWlanSignalLevelHandler::SetManualHoDone" );
-    iManualHoDone = aValue;
-    }
-
-
-// ---------------------------------------------------------------------------
-// Cancel outstanding requests.
-// ---------------------------------------------------------------------------
-//
-void CVccWlanSignalLevelHandler::DoCancel()
-    {
-    RUBY_DEBUG_BLOCK( "CVccSignalLevelHandler::DoCancel" );
-    switch ( iOperation )
-        {
-        case EOperationWait:
-        case EOperationNone:
-            {
-            RUBY_DEBUG0( "EOperationWait / EOperationNone" );
-            CTimer::DoCancel();
-
-            break;
-            }
-
-
-        default:
-            {
-            break;
-            }
-        }
-    }