diff -r 63be7eb3fc78 -r f28ada11abbf wlanutilities/wlansniffer/engine/server/src/wsfwlansettingsaccessor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wlanutilities/wlansniffer/engine/server/src/wsfwlansettingsaccessor.cpp Wed Sep 01 12:20:32 2010 +0100 @@ -0,0 +1,350 @@ +/* +* 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 CWsfWlanSettingsAccessor +* +*/ + + +// EXTERNAL INCLUDES +#include +#include +#include + +#include +#include +#include + +// CLASS HEADER +#include "wsfwlansettingsaccessor.h" + +// INTERNAL INCLUDES +#include "wsfwlanscanintervalchangeobserver.h" +#include "wsflogger.h" + + +using namespace CommsDat; + +// background scan disabled value +static const TUint KWlanBgScanIntervalNever = 0; + +// background scan automatic scanning value +static const TUint KWlanBgScanIntervalAuto = 0xffffffff; + +// default background scan interval in seconds +static const TUint KWlanBgScanIntervalDefault = 300; + +// hold-up time after first DB notification to prevent bursts (in microseconds) +static const TUint KDbNotificationHoldupTime = 1000 * 1000; + + + +// ---------------------------------------------------------------------------- +// CWsfWlanSettingsAccessor::NewL +// ---------------------------------------------------------------------------- +// +CWsfWlanSettingsAccessor* CWsfWlanSettingsAccessor::NewL( + CMDBSession& aDbSession ) + { + CWsfWlanSettingsAccessor *thisPtr = NewLC( aDbSession ); + CleanupStack::Pop( thisPtr ); + return thisPtr; + } + + +// ---------------------------------------------------------------------------- +// CWsfWlanSettingsAccessor::NewLC +// ---------------------------------------------------------------------------- +// +CWsfWlanSettingsAccessor* CWsfWlanSettingsAccessor::NewLC( + CMDBSession& aDbSession ) + { + CWsfWlanSettingsAccessor *thisPtr = + new (ELeave) CWsfWlanSettingsAccessor( aDbSession ); + CleanupStack::PushL( thisPtr ); + thisPtr->ConstructL(); + return thisPtr; + } + + +// ---------------------------------------------------------------------------- +// CWsfWlanSettingsAccessor::CWsfWlanSettingsAccessor +// ---------------------------------------------------------------------------- +// +CWsfWlanSettingsAccessor::CWsfWlanSettingsAccessor( CMDBSession& aDbSession ): + CActive( CActive::EPriorityStandard ), + iDbSession( &aDbSession ), + iBeingHeldUp( EFalse ) + { + } + + +// ---------------------------------------------------------------------------- +// CWsfWlanSettingsAccessor::ConstructL +// ---------------------------------------------------------------------------- +// +void CWsfWlanSettingsAccessor::ConstructL() + { + CActiveScheduler::Add( this ); + + // get WLAN table id + TRAP_IGNORE( iTableId = CCDWlanDeviceSettingsRecord::TableIdL( + *iDbSession ) ); + + if ( !iTableId ) + { + iTableId = CCDWlanDeviceSettingsRecord::CreateTableL( *iDbSession ); + } + + iWlanSettingsRecord = new (ELeave) CCDWlanDeviceSettingsRecord( iTableId ); + iWlanSettingsRecord->iWlanDeviceSettingsType = KWlanUserSettings; + + if ( !iWlanSettingsRecord->FindL( *iDbSession ) ) + { + User::Leave( KErrNotFound ); + } + + User::LeaveIfError( iTimer.CreateLocal() ); + + DoCheckSettingL( iScanInterval, iShowAvailability ); + } + + +// ---------------------------------------------------------------------------- +// CWsfWlanSettingsAccessor::~CWsfWlanSettingsAccessor +// ---------------------------------------------------------------------------- +// +CWsfWlanSettingsAccessor::~CWsfWlanSettingsAccessor() + { + Cancel(); + iTimer.Close(); + iDbSession = NULL; // not owning + iChangeObserver = NULL; // not owning + delete iWlanSettingsRecord; // own + iWlanSettingsRecord = NULL; + } + + +// ---------------------------------------------------------------------------- +// CWsfWlanSettingsAccessor::ScanInterval +// ---------------------------------------------------------------------------- +// +TUint CWsfWlanSettingsAccessor::ScanInterval() const + { + LOG_ENTERFN( "CWsfWlanSettingsAccessor::ScanInterval" ); + return iScanInterval; + } + + +// ---------------------------------------------------------------------------- +// CWsfWlanSettingsAccessor::ShowAvailability +// ---------------------------------------------------------------------------- +// +TBool CWsfWlanSettingsAccessor::ShowAvailability() const + { + LOG_ENTERFN( "CWsfWlanSettingsAccessor::ShowAvailability" ); + return iShowAvailability; + } + + +// ---------------------------------------------------------------------------- +// CWsfWlanSettingsAccessor::RequestNotificationL +// ---------------------------------------------------------------------------- +// +void CWsfWlanSettingsAccessor::RequestNotificationL( + MWsfWlanScanIntervalChangeObserver& aObserver ) + { + LOG_ENTERFN( "CWsfWlanSettingsAccessor::RequestNotificationL" ); + iChangeObserver = &aObserver; + IssueNotificationRequestL(); + } + + +// ---------------------------------------------------------------------------- +// CWsfWlanSettingsAccessor::IssueNotificationRequestL +// ---------------------------------------------------------------------------- +// +void CWsfWlanSettingsAccessor::IssueNotificationRequestL() + { + LOG_ENTERFN( "CWsfWlanSettingsAccessor::IssueNotificationRequestL" ); + if ( iChangeObserver ) + { + if ( !IsActive() ) + { + LOG_WRITE( "issuing..." ); + User::LeaveIfError( iWlanSettingsRecord->RequestNotification( + *iDbSession, iStatus ) ); + SetActive(); + } + } + } + + +// ---------------------------------------------------------------------------- +// CWsfWlanSettingsAccessor::CancelNotifications +// ---------------------------------------------------------------------------- +// +void CWsfWlanSettingsAccessor::CancelNotifications() + { + LOG_ENTERFN( "CWsfWlanSettingsAccessor::CancelNotifications" ); + Cancel(); + iChangeObserver = NULL; + } + + +// ---------------------------------------------------------------------------- +// CWsfWlanSettingsAccessor::DoCheckSettingL +// ---------------------------------------------------------------------------- +// +void CWsfWlanSettingsAccessor::DoCheckSettingL( TUint& aBgScanInterval, + TBool& aShowAvailability ) + { + LOG_ENTERFN( "CWsfWlanSettingsAccessor::DoCheckSettingL" ); + // open the wlan settings table + + iWlanSettingsRecord->RefreshL( *iDbSession ); + FeatureManager::InitializeLibL(); + + aShowAvailability = ( iWlanSettingsRecord->iBgScanInterval != + KWlanBgScanIntervalNever ); + + // read the common value + if ( iWlanSettingsRecord->iBgScanInterval == KWlanBgScanIntervalNever ) + { + if ( iWlanSettingsRecord->iSavedBgScanInterval == + KWlanBgScanIntervalNever ) + { + TInt defaultScanInterval( KWlanBgScanIntervalDefault ); + + if (FeatureManager::FeatureSupported( KFeatureIdPowerSave )) + { + // Read the default value from CenRep (different in PSM mode) + CRepository* cenrep = CRepository::NewL( + KCRUidWlanDeviceSettingsRegistryId ); + cenrep->Get( KWlanDefaultBGScanInterval, defaultScanInterval ); + delete cenrep; + } + + aBgScanInterval = TUint( defaultScanInterval ); + } + else + { + aBgScanInterval = iWlanSettingsRecord->iSavedBgScanInterval; + } + } + else + { + aBgScanInterval = iWlanSettingsRecord->iBgScanInterval; + } + + // Set scan interval to default value if adaptive scanning value is + // found from db + if (aBgScanInterval == KWlanBgScanIntervalAuto ) + { + TInt defaultScanInterval( KWlanBgScanIntervalDefault ); + aBgScanInterval = TUint( defaultScanInterval ); + } + + FeatureManager::UnInitializeLib(); + LOG_WRITEF( "current bgScanInterval = %d sec", aBgScanInterval ); + LOG_WRITEF( "current showAvailability = %d", aShowAvailability ); + } + + +// ---------------------------------------------------------------------------- +// CWsfWlanSettingsAccessor::CheckIfSettingChangedL +// ---------------------------------------------------------------------------- +// +TBool CWsfWlanSettingsAccessor::CheckIfSettingChangedL() + { + LOG_ENTERFN( "CWsfWlanSettingsAccessor::CheckIfSettingChangedL" ); + LOG_WRITEF( "previous bgScanInterval = %d", iScanInterval ); + LOG_WRITEF( "previous showAvailability = %d", iShowAvailability ); + TUint newBgsi( 0 ); + TBool newSaf( EFalse ); + + DoCheckSettingL( newBgsi, newSaf ); + + TBool retval( newBgsi != iScanInterval || newSaf != iShowAvailability ); + iScanInterval = newBgsi; + iShowAvailability = newSaf; + + return retval; + } + + +// ---------------------------------------------------------------------------- +// CWsfWlanSettingsAccessor::RunL +// ---------------------------------------------------------------------------- +// +void CWsfWlanSettingsAccessor::RunL() + { + LOG_ENTERFN( "CWsfWlanSettingsAccessor::RunL" ); + LOG_WRITEF( "iStatus.Int() = %d", iStatus.Int() ); + + // Symbian DB notifiers are triggered by everything that may happen in + // commsdat, so it would be very resource-consuming to check the value on + // each database event + // Workaround: 1-sec delay when first callback is received + + if ( !iBeingHeldUp ) + { + LOG_WRITE( "starting anti-burst delay" ); + iBeingHeldUp = ETrue; + iTimer.After( iStatus, TTimeIntervalMicroSeconds32( + KDbNotificationHoldupTime ) ); + SetActive(); + } + else + { + LOG_WRITE( "checking changes" ); + iBeingHeldUp = EFalse; + if ( CheckIfSettingChangedL() ) + { + LOG_WRITE( "setting changed, notifying observer" ); + iChangeObserver->WlanScanIntervalChangedL( iScanInterval, + iShowAvailability ); + } + + IssueNotificationRequestL(); + } + + } + + +// ---------------------------------------------------------------------------- +// CWsfWlanSettingsAccessor::DoCancel +// ---------------------------------------------------------------------------- +// +void CWsfWlanSettingsAccessor::DoCancel() + { + iTimer.Cancel(); + iBeingHeldUp = EFalse; + + if ( iWlanSettingsRecord ) + { + iWlanSettingsRecord->CancelNotification( *iDbSession, iStatus ); + } + } + + +// ---------------------------------------------------------------------------- +// CWsfWlanSettingsAccessor::RunError +// ---------------------------------------------------------------------------- +// +TInt CWsfWlanSettingsAccessor::RunError( TInt /*aError*/ ) + { + TRAP_IGNORE( IssueNotificationRequestL() ); + return KErrNone; + } +