diff -r 000000000000 -r c40eb8fe8501 wlan_bearer/wlanpsmplugin/src/wlanpsmplugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wlan_bearer/wlanpsmplugin/src/wlanpsmplugin.cpp Tue Feb 02 02:03:13 2010 +0200 @@ -0,0 +1,284 @@ +/* +* Copyright (c) 2006-2009 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: ECOM plugin implementation +* +*/ + +/* +* %version: 7 % +*/ + +// INCLUDE FILES +#include +#include +#include +#include +#include "wdbifwlandefs.h" +#include +#include "wlanpsmplugin.h" +#include "am_debug.h" + +// CONSTANT DEFINITIONS +const TUint32 KWlanPsmConfigId = 0x200100C0; + +enum TPsmPluginFirstKeys + { + EWlanPsmKey1 = 1 + }; + +/** +* Pairs ECom implementation UIDs with a pointer to the instantiation +* method for that implementation. Required for all ECom implementation +* collections. +*/ +const TImplementationProxy ImplementationTable[] = + { + {{0x200100C2}, reinterpret_cast(CWlanPsmPlugin::NewL)} + }; + +// ========================== EXPORTED FUNCTIONS ========================= + +// --------------------------------------------------------- +// Returns an instance of the proxy table. +// Returns: KErrNone +// --------------------------------------------------------- +// +EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount ) + { + aTableCount = sizeof( ImplementationTable ) / sizeof( TImplementationProxy ); + return ImplementationTable; + } + +// ============================ MEMBER FUNCTIONS =============================== + +// +// ---------------------------------------------------------------------------------- +// CWlanPsmPlugin::CWlanPsmPlugin() +// ---------------------------------------------------------------------------------- +// +CWlanPsmPlugin::CWlanPsmPlugin( TPsmPluginCTorParams& aInitParams ) : + CPsmPluginBase( aInitParams ) + { + DEBUG ( "CWlanPsmPlugin::CWlanPsmPlugin()" ); + } + +// ----------------------------------------------------------------------------- +// CWlanPsmPlugin::ConstructL( +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CWlanPsmPlugin::ConstructL() + { + DEBUG ( "CWlanPsmPlugin::ConstructL()" ); + User::LeaveIfError( iWlmServer.Connect() ); + } + +// +// ---------------------------------------------------------------------------------- +// CWlanPsmPlugin::NewL() +// ---------------------------------------------------------------------------------- +// +// Two-phased constructor. +CWlanPsmPlugin* CWlanPsmPlugin::NewL( TPsmPluginCTorParams& aInitParams ) + { + DEBUG ( "CWlanPsmPlugin::NewL()" ); + + CWlanPsmPlugin* self = new ( ELeave ) CWlanPsmPlugin( aInitParams ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + +// +// ---------------------------------------------------------------------------------- +// CWlanPsmPlugin::~CWlanPsmPlugin() +// ---------------------------------------------------------------------------------- +// +// Destructor. +CWlanPsmPlugin::~CWlanPsmPlugin() + { + DEBUG ( "CWlanPsmPlugin::~CWlanPsmPlugin()" ); + iWlmServer.Close(); + } + +// +// ---------------------------------------------------------------------------------- +// CWlanPsmPlugin::NotifyModeChange() +// ---------------------------------------------------------------------------------- +// +void CWlanPsmPlugin::NotifyModeChange( const TInt aMode ) + { + DEBUG1( "CWlanPsmPlugin::NotifyModeChange(), Mode:%d", aMode ); + + //call the function that can Leave + TRAPD( err, NotifyModeChangeL(aMode) ); + if (err) + { + DEBUG("CWlanPsmPlugin::NotifyModeChange(), NotifyModeChangeL Leave'd"); + } + } + + +// +// ---------------------------------------------------------------------------------- +// CWlanPsmPlugin::NotifyModeChangeL() +// ---------------------------------------------------------------------------------- +// +void CWlanPsmPlugin::NotifyModeChangeL( const TInt aMode ) + { + +#ifdef _DEBUG + if( aMode == EPsmsrvModePowerSave ) + { + DEBUG1( "CWlanPsmPlugin::NotifyModeChangeL() - aMode: EPsmsrvModePowerSave (%d)", aMode ); + } + else if ( aMode == EPsmsrvPartialMode ) + { + DEBUG1( "CWlanPsmPlugin::NotifyModeChangeL() - aMode: EPsmsrvPartialMode (%d)", aMode ); + } + else if ( aMode == EPsmsrvModeNormal ) + { + DEBUG1( "CWlanPsmPlugin::NotifyModeChangeL() - aMode: EPsmsrvModeNormal (%d)", aMode ); + } + else + { + DEBUG1( "CWlanPsmPlugin::NotifyModeChangeL() - unrecognised aMode: %d", aMode ); + } +#endif + + //NOTE: The plugin changes only the current BG scan interval in CommsDat. + //Updating of Default BG scan interval in CenRep is taken care by PSM Engine + //using Passive configuration file. + + RConfigInfoArray infoArray; + TPsmsrvConfigInfo info1; + TUint32 bgScanIntervalCurrentlyInCommsDat, bgScanIntervalFromPsmFramework; + TBool updateBgScanIntervalToCommsDat = EFalse; + CCommsDatabase* commDB = NULL; + CCommsDbTableView* table = NULL; + + //Read current BG interval from CommsDat + commDB = CCommsDatabase::NewL(); + CleanupStack::PushL( commDB ); + + table = commDB->OpenViewMatchingUintLC( TPtrC(WLAN_DEVICE_SETTINGS), + TPtrC(WLAN_DEVICE_SETTINGS_TYPE), + KWlanUserSettings ); + + User::LeaveIfError( table->GotoFirstRecord() ); + + table->ReadUintL( TPtrC( WLAN_BG_SCAN_INTERVAL ), bgScanIntervalCurrentlyInCommsDat ); + + // Backup and Get settings... + info1.iConfigId = EWlanPsmKey1; + info1.iConfigType = EConfigTypeInt; + info1.iIntValue = bgScanIntervalCurrentlyInCommsDat; + infoArray.Append( info1 ); + + iSettingsProvider.BackupAndGetSettingsL( infoArray, KWlanPsmConfigId ); + + bgScanIntervalFromPsmFramework = infoArray[0].iIntValue; + + DEBUG2( "CWlanPsmPlugin::NotifyModeChangeL() - current value in CommsDat: %u, PSM Framework provided value: %u", + bgScanIntervalCurrentlyInCommsDat, bgScanIntervalFromPsmFramework); + + if ( EPsmsrvModePowerSave == aMode || EPsmsrvPartialMode == aMode ) + { + DEBUG( "CWlanPsmPlugin::NotifyModeChangeL() - PSM server mode is changing to EPsmsrvModePowerSave/EPsmsrvPartialMode" ); + + // if bg scan interval is neither non-zero nor automatic... + if ( bgScanIntervalCurrentlyInCommsDat != 0 && bgScanIntervalCurrentlyInCommsDat != 0xFFFFFFFF ) + { + DEBUG1( "CWlanPsmPlugin::NotifyModeChangeL() - storing Automatic value to CommsDat as current CommsDat value (%u) is non-zero and non-Automatic", + bgScanIntervalCurrentlyInCommsDat ); + // set bg scan interval to automatic + updateBgScanIntervalToCommsDat = ETrue; + } +#ifdef _DEBUG + else + { + DEBUG1( "CWlanPsmPlugin::NotifyModeChangeL() - CommsDat update not needed as current value (%u) is zero or Automatic", bgScanIntervalCurrentlyInCommsDat ); + } +#endif + } + else + { + DEBUG( "CWlanPsmPlugin::NotifyModeChangeL() - PSM server mode is changing to EPsmsrvModeNormal" ); + // If backed up value is... + // * zero -> if current value in commsdat is automatic, user has set bg scan to automatic during power save, no need to change commsdat. + // -> if current value in commsdat is zero -> commsdat had setting zero before entering power save -> no need to change commsdat. + // -> UI shall prevent setting other values in commsdat during power save. + // * automatic -> if current value in commsdat is automatic, no need to change commsdat. + // -> if current value in commsdat is zero, no need to change commsdat. + // -> UI shall prevent setting other values in commsdat during power save. + // * non-zero -> if current value in commsdat is automatic, plugin set value to automatic during entering power save mode -> restore backed up setting to commsdat. + // -> if current value in commsdat is zero, user has disabled background scan -> no need to change commsdat. + // -> UI shall prevent setting other values in commsdat during power save. + if( bgScanIntervalFromPsmFramework != 0 && bgScanIntervalFromPsmFramework != 0xFFFFFFFF ) + { + DEBUG1( "CWlanPsmPlugin::NotifyModeChangeL() - backed up value (%u) is non-zero or non-Automatic", bgScanIntervalFromPsmFramework ); + if( bgScanIntervalCurrentlyInCommsDat == 0xFFFFFFFF ) + { + DEBUG( "CWlanPsmPlugin::NotifyModeChangeL() - current value in CommsDat is Automatic -> restoring backed up value to CommsDat" ); + // restore background scan interval from backup + updateBgScanIntervalToCommsDat = ETrue; + } +#ifdef _DEBUG + else + { + DEBUG( "CWlanPsmPlugin::NotifyModeChangeL() - no CommsDat update needed as current value in commsdat is zero" ); + if( bgScanIntervalCurrentlyInCommsDat != 0 ) + { + DEBUG1( "CWlanPsmPlugin::NotifyModeChangeL() - value in CommsDat is non-zero (%u) -> do assert, UI shouldn't allow setting other than 0 or Automatic", + bgScanIntervalCurrentlyInCommsDat ); + ASSERT( 0 ); + } + } +#endif + } +#ifdef _DEBUG + else + { + DEBUG1( "CWlanPsmPlugin::NotifyModeChangeL() - no CommsDat update needed as backed up value (%u) is zero or Automatic", bgScanIntervalFromPsmFramework ); + } +#endif + } + + if ( updateBgScanIntervalToCommsDat ) + { + DEBUG1( "CWlanPsmPlugin::NotifyModeChangeL() - updating CommsDat with value: %d", + bgScanIntervalFromPsmFramework); + + //update CommsDb to reflect the changed value + User::LeaveIfError( table->UpdateRecord() ); + table->WriteUintL( TPtrC(WLAN_BG_SCAN_INTERVAL), bgScanIntervalFromPsmFramework ); + User::LeaveIfError( table->PutRecordChanges() ); + + DEBUG( "CWlanPsmPlugin::NotifyModeChangeL() - informing WLAN Engine about changed value" ); + iWlmServer.NotifyChangedSettings(); + } + + DEBUG( "CWlanPsmPlugin::NotifyModeChangeL() - notifying WLAN Engine about new power save mode" ); + iWlmServer.NotifyChangedPsmSrvMode( aMode ); + + // cleanup + CleanupStack::PopAndDestroy( table ); + CleanupStack::PopAndDestroy( commDB ); + + infoArray.Reset(); + } +