--- /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 <e32std.h>
+#include <ecom/implementationproxy.h>
+#include <commdb.h>
+#include <psmsettingsprovider.h>
+#include "wdbifwlandefs.h"
+#include <wlanmgmtclient.h>
+#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<TProxyNewLPtr>(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();
+ }
+