wlan_bearer/wlanpsmplugin/src/wlanpsmplugin.cpp
changeset 0 c40eb8fe8501
--- /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();
+    }
+