diff -r 000000000000 -r a4daefaec16c convergedconnectionhandler/cchserver/src/cchwlanextension.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/convergedconnectionhandler/cchserver/src/cchwlanextension.cpp Mon Jan 18 20:12:36 2010 +0200 @@ -0,0 +1,279 @@ +/* +* Copyright (c) 2007 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: +* class implementation for CCchWlanExtension +* +*/ + + +// INCLUDE FILES +#include "cchwlanextension.h" +#include "cchprivatecrkeys.h" +#include "cchlogger.h" + +#include +#include +#include +#include + +// CONSTANTS + +const TUint32 KWlanScanRateDeactive = 0; //scan not active +const TUint32 KWlanScanRateActive = 300; //value used when cch activates 1st scan + +const TInt KRetryTimeout( 100000 ); // 0,1s delay for comms db begintransaction retry (microseconds) +const TInt KRetryCount( 6 ); // Maximum number of retries + + +// ============================ MEMBER FUNCTIONS ============================= + +// --------------------------------------------------------------------------- +// CCchWlanExtension::NewL() +// Symbian OS two-phased constructor +// --------------------------------------------------------------------------- +CCchWlanExtension* CCchWlanExtension::NewL( ) + { + CCchWlanExtension* self = new( ELeave ) CCchWlanExtension( ); + CleanupStack::PushL( self ); + self->ConstructL(); + + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CCchWlanExtension::ConstructL() +// Symbian OS two-phased constructor +// --------------------------------------------------------------------------- +void CCchWlanExtension::ConstructL() + { + CCHLOGSTRING2( "CCchWlanExtension::ConstructL[0x%x]: IN", this ); + // Create connection to the Access Points setting data. + iAPCommsDatabase = CCommsDatabase::NewL( EDatabaseTypeIAP ); + + // Create connection to the WLAN setting data. + iWLANCommsDatabase = CCommsDatabase::NewL(); + + iCchRepository = CRepository::NewL( KCRUidCch ); + CCHLOGSTRING( "CCchWlanExtension::ConstructL: OUT" ); + } + +// --------------------------------------------------------------------------- +// CCchWlanExtension::CCchWlanExtension() +// Constructor. +// --------------------------------------------------------------------------- +CCchWlanExtension::CCchWlanExtension( ) : + iLastSavedScanInterval( 0 ) + { + } + +// --------------------------------------------------------------------------- +// CGSUiVoIPExtension::~CCchWlanExtension() +// Destructor. +// --------------------------------------------------------------------------- +CCchWlanExtension::~CCchWlanExtension() + { + delete iWLANCommsDatabase; + delete iAPCommsDatabase; + delete iCchRepository; + } + +// --------------------------------------------------------------------------- +// CCchWlanExtension::ForceEnableWlanScanL +// --------------------------------------------------------------------------- +void CCchWlanExtension::ForceEnableWlanScanL() + { + CCHLOGSTRING( "CCchWlanExtension::ForceEnableWlanScanL: IN" ); + TInt scanRate = CheckAvailabilityStatusL(); + if( KWlanScanRateDeactive != scanRate ) + { + CCHLOGSTRING( "CCchWlanExtension::Forced to disable/enable wlan scan" ); + SetAvailabilitySwitchL( KWlanScanRateDeactive ); + SetAvailabilitySwitchL( iLastSavedScanInterval ); + } + else + { + CCHLOGSTRING( "CCchWlanExtension::Normal wlan scan enable" ); + EnableWlanScanL(); + } + + CCHLOGSTRING( "CCchWlanExtension::ForceEnableWlanScanL: OUT" ); + } + +// --------------------------------------------------------------------------- +// CCchWlanExtension::EnableWlanScanL +// --------------------------------------------------------------------------- +void CCchWlanExtension::EnableWlanScanL() + { + CCHLOGSTRING( "CCchWlanExtension::EnableWlanScanL: IN" ); + TInt err( KErrNone ); + TInt wlanActivation( 0 ); + err = iCchRepository->Get( + KCCHWasWlanScanActivatedBeforeServiceEnabling, + wlanActivation ); + User::LeaveIfError( err ); + TInt scanRate = CheckAvailabilityStatusL(); + // Activate the WLAN scan setting if needed. + if( KErrNone == err ) + { + if( ECCHWlanScanNotDefined == wlanActivation ) + { + if( KWlanScanRateDeactive < scanRate ) + { + iCchRepository->Set( KCCHWasWlanScanActivatedBeforeServiceEnabling, + ECCHWlanScanWasEnabled ); + CCHLOGSTRING( "CCchWlanExtension::EnableWlanScanL; scan was enabled by user" ); + } + else + { + iCchRepository->Set( KCCHWasWlanScanActivatedBeforeServiceEnabling, + ECCHWlanScanWasNotEnabled ); + + CCHLOGSTRING( "CCchWlanExtension::EnableWlanScanL; scan was enabled by CCH" ); + } + } + } + if( KWlanScanRateDeactive == scanRate ) + { + SetAvailabilitySwitchL( iLastSavedScanInterval ); + } + + CCHLOGSTRING( "CCchWlanExtension::EnableWlanScanL: OUT" ); + } +// --------------------------------------------------------------------------- +// CCchWlanExtension::DisableWlanScanL +// --------------------------------------------------------------------------- +void CCchWlanExtension::DisableWlanScanL() + { + CCHLOGSTRING( "CCchWlanExtension::DisableWlanScanL: IN" ); + // Deactivate the WLAN scan setting if needed. + TInt err( KErrNone ); + TInt wlanActivation( 0 ); + err = iCchRepository->Get( + KCCHWasWlanScanActivatedBeforeServiceEnabling, + wlanActivation ); + User::LeaveIfError( err ); + TInt scanRate = CheckAvailabilityStatusL(); + CCHLOGSTRING2( "CCchWlanExtension::DisableWlanScanL: ERROR:%d", err ); + if( KErrNone == err ) + { + CCHLOGSTRING2( "CCchWlanExtension::DisableWlanScanL: activation:%d", wlanActivation ); + if ( KWlanScanRateDeactive < scanRate ) + { + CCHLOGSTRING( "CCchWlanExtension::DisableWlanScanL: scan is active" ); + if( ECCHWlanScanNotDefined != wlanActivation ) + { + if( ECCHWlanScanWasNotEnabled == wlanActivation ) + { + CCHLOGSTRING( "CCchWlanExtension::DisableWlanScanL: disabling wlan scan" ); + SetAvailabilitySwitchL( KWlanScanRateDeactive ); + } + err = iCchRepository->Set( KCCHWasWlanScanActivatedBeforeServiceEnabling, + ECCHWlanScanNotDefined ); + User::LeaveIfError( err ); + } + } + } + CCHLOGSTRING( "CCchWlanExtension::DisableWlanScanL: OUT" ); + } + +// --------------------------------------------------------------------------- +// CCchWlanExtension::CheckAvailabilityStatusL +// Checks WLAN availability setting status. +// --------------------------------------------------------------------------- +// +TUint32 CCchWlanExtension::CheckAvailabilityStatusL() + { + CCHLOGSTRING( "CCchWlanExtension::CheckAvailabilityStatusL: IN" ); + TUint32 scanRate( KErrNone ); + // Open WLAN setting table and get availability data. + CCommsDbTableView* view = + iWLANCommsDatabase->OpenViewMatchingUintLC + ( + TPtrC( WLAN_DEVICE_SETTINGS ), + TPtrC( WLAN_DEVICE_SETTINGS_TYPE ), + KWlanUserSettings + ); + + User::LeaveIfError( view->GotoFirstRecord() ); + view->ReadUintL( TPtrC( WLAN_BG_SCAN_INTERVAL ), scanRate ); + //ignore leave if there is no such column WLAN_SAVED_BG_SCAN_INTERVAL + TRAP_IGNORE( view->ReadUintL( TPtrC( WLAN_SAVED_BG_SCAN_INTERVAL ), + iLastSavedScanInterval ) ); + + if( 0 == iLastSavedScanInterval ) + { + iLastSavedScanInterval = KWlanScanRateActive; + } + CCHLOGSTRING3( + "CCchWlanExtension::CheckAvailabilityStatusL: interval: %d, saved: %d", + scanRate, iLastSavedScanInterval ); + CleanupStack::PopAndDestroy( view ); + CCHLOGSTRING( "CCchWlanExtension::CheckAvailabilityStatusL: OUT" ); + // Return scan rate value. + return scanRate; + } + +// ----------------------------------------------------------------------------- +// CCchWlanExtension::SetAvailabilitySwitchL +// Sets WLAN availability switch based on scan rate given. +// ----------------------------------------------------------------------------- +void CCchWlanExtension::SetAvailabilitySwitchL( TUint32 aScanRate ) + { + CCHLOGSTRING( "CCchWlanExtension::SetAvailabilitySwitchL: IN" ); + // Open WLAN setting table and record. + CCommsDbTableView* view = iWLANCommsDatabase->OpenViewMatchingUintLC + ( + TPtrC( WLAN_DEVICE_SETTINGS ), + TPtrC( WLAN_DEVICE_SETTINGS_TYPE ), + KWlanUserSettings + ); + + User::LeaveIfError( view->GotoFirstRecord() ); + User::LeaveIfError( view->UpdateRecord() ); + + // Set new WLAN availability setting value to comms database. + view->WriteUintL( TPtrC( WLAN_BG_SCAN_INTERVAL ), aScanRate ); + + TInt round( 0 ); + TInt err( KErrNone ); + do + { + // Complete transaction procedure. + err = view->PutRecordChanges(); + + if ( KErrNone != err ) + { + User::After( round * KRetryTimeout ); + round++; + } + } + while ( KErrNone != err && round < KRetryCount); + + if ( KErrNone != err ) + { + CCHLOGSTRING( "CCchWlanExtension::SetAvailabilitySwitchL: PutRecordChanges was unsuccessful" ); + User::Leave( err ); + } + + CleanupStack::PopAndDestroy( view ); + + // Notifying WLAN Engine about changes in settings. + CWlanMgmtClient* wlanMgmtClient = CWlanMgmtClient::NewL(); + wlanMgmtClient->NotifyChangedSettings(); + delete wlanMgmtClient; + CCHLOGSTRING( "CCchWlanExtension::SetAvailabilitySwitchL: OUT" ); + } + +// End of file