diff -r 000000000000 -r f63038272f30 bluetoothengine/bteng/btpsmplugin/src/btpsmplugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetoothengine/bteng/btpsmplugin/src/btpsmplugin.cpp Mon Jan 18 20:28:57 2010 +0200 @@ -0,0 +1,259 @@ +/* +* Copyright (c) 2006-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: Implement PSM plug-in and handle BT PowerState with PSM mode +* +*/ + + +#include +#include +#include +#include + +#include "btengpsmplugin.h" +#include "debug.h" + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CBTPsmPlugin::NewL +// Two phased constructor +// --------------------------------------------------------------------------- +// +CBTPsmPlugin* CBTPsmPlugin::NewL(TPsmPluginCTorParams& aInitParams) + { + CBTPsmPlugin* self = new (ELeave) CBTPsmPlugin(aInitParams); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CBTPsmPlugin::~CBTPsmPlugin +// Destructor +// --------------------------------------------------------------------------- +// +CBTPsmPlugin::~CBTPsmPlugin() + { + TRACE_FUNC_ENTRY + + delete iBtEngSettings; + + TRACE_FUNC_EXIT + } + +// --------------------------------------------------------------------------- +// From class CPSMBase +// CBTPsmPlugin::NotifyModeChange() +// Handle BT power state when PowerSaveMode enables/disables. +// --------------------------------------------------------------------------- +// +void CBTPsmPlugin::NotifyModeChange( const TInt aMode ) + { + iMode = aMode; + TRAP_IGNORE(NotifyModeChangeL()); + } + +// --------------------------------------------------------------------------- +// From class MBTEngSettingsObserver +// CBTPsmPlugin::PowerStateChanged() +// Save the changed power state into PSM storage as settings in Normal mode +// if the change was caused by the user. +// --------------------------------------------------------------------------- +// +void CBTPsmPlugin::PowerStateChanged( TBTPowerStateValue aState ) + { + TRACE_FUNC_ENTRY + + if( iMode == EPsmsrvModePowerSave && iAllowToConfig) + { + TRAP_IGNORE( SavePsmConfigurationL( aState ) ); + } + + if( !iAllowToConfig ) + { + iAllowToConfig = ETrue; + } + + TRACE_FUNC_EXIT + }; + +// --------------------------------------------------------------------------- +// From class MBTEngSettingsObserver +// CBTPsmPlugin::VisibilityModeChanged() +// Power Saving Mode change does not affect Bluetooth visibility. +// --------------------------------------------------------------------------- +// +void CBTPsmPlugin::VisibilityModeChanged( TBTVisibilityMode /*aState*/ ) + { + } + +// --------------------------------------------------------- +// CBTPsmPlugin::CBTPsmPlugin +// Default C++ constructor +// --------------------------------------------------------- +CBTPsmPlugin::CBTPsmPlugin( TPsmPluginCTorParams& aInitParams ) + : CPsmPluginBase( aInitParams ), iMode( KErrNotFound ), iAllowToConfig( EFalse ) + { + } + +// --------------------------------------------------------- +// CBTPsmPlugin::ConstructL +// Symbian 2nd phase constructor can leave. +// --------------------------------------------------------- +// +void CBTPsmPlugin::ConstructL() + { + TRACE_FUNC_ENTRY + + iBtEngSettings = CBTEngSettings::NewL(this); + + TRACE_FUNC_EXIT + } + +// --------------------------------------------------------------------------- +// CBTPsmPlugin::NotifyModeChangeL() +// Leave function called by NotifyModeChange() +// Handle BT power state when PowerSaveMode enables/disables. +// --------------------------------------------------------------------------- +// +void CBTPsmPlugin::NotifyModeChangeL() + { + TRACE_FUNC_ENTRY + TInt connNum = 0; + TInt retVal = RProperty::Get(KPropertyUidBluetoothCategory, KPropertyKeyBluetoothGetPHYCount, connNum); + TRACE_INFO((_L("[BTPsmPlugin]\t GetPHYCount result: %d"), retVal)); + + if( iMode == EPsmsrvModePowerSave ) + { + if( !retVal ) + { + TRACE_INFO((_L("[BTPsmPlugin]\t PHYCount=: %d"), connNum)); + + if( connNum > 0 ) // active connection exists + { + iAllowToConfig = ETrue; + } + else //no active connections + { + HandlePowerStateL(); + } + } + } + + if( iMode == EPsmsrvModeNormal ) + { + if( !retVal && connNum == 0 ) // active connection exists + { + HandlePowerStateL(); + } + iAllowToConfig = EFalse; + } + + TRACE_FUNC_EXIT + } + +// --------------------------------------------------------------------------- +// CBTPsmPlugin::HandlePowerStateL() +// Handle how to change BT power state +// --------------------------------------------------------------------------- +// +void CBTPsmPlugin::HandlePowerStateL() + { + TRACE_FUNC_ENTRY + + TBTPowerStateValue powerBeforeChange; + iBtEngSettings->GetPowerState( powerBeforeChange ); + if( powerBeforeChange == EBTPowerOff ) + { + iAllowToConfig = ETrue; + } + + TBTPowerStateValue powerToChange = EBTPowerOff; + TRAPD(err, powerToChange = GetSettingsFromPsmStorageL() ); + TRACE_INFO((_L("[BTPsmPlugin]\t CBTPsmPlugin::GetSettingsFromPsmStorageL Leave status: %d"), err)); + // If we can't read previous BT state information from PSM configuration, + // BT Power is not toogled only if PSM is switching of. + // When switching PSM On BT should be always turned Off. + // Active connections were checked before. + if( powerBeforeChange != powerToChange && ( !err || iMode == EPsmsrvModePowerSave ) ) + { + TInt errCode = iBtEngSettings->SetPowerState( powerToChange ); + TRACE_INFO((_L("[BTPsmPlugin]\t CBTPsmPlugin::HandlePowerStateL() %d"), errCode)); + } + + if( iMode == EPsmsrvModePowerSave ) + { + SavePsmConfigurationL( powerBeforeChange ); + } + + TRACE_FUNC_EXIT + } + +// --------------------------------------------------------------------------- +// CBTPsmPlugin::GetSettingsFromPsmStorageL() +// Retrive power state from PSM configuration file +// --------------------------------------------------------------------------- +// +TBTPowerStateValue CBTPsmPlugin::GetSettingsFromPsmStorageL() + { + TRACE_FUNC_ENTRY + + TPsmsrvConfigInfo info; + info.iConfigId = 1; + info.iConfigType = EConfigTypeInt; + info.iIntValue = 0; + info.iBlocked = EFalse; + + RConfigInfoArray configInfoArray; + CleanupClosePushL( configInfoArray ); + + configInfoArray.AppendL( info ); + iSettingsProvider.GetSettingsL(configInfoArray, KCRUidBluetoothPowerState.iUid); + + TBTPowerStateValue power = EBTPowerOff; + if( configInfoArray.Count() > 0 ) + { + power = (TBTPowerStateValue) configInfoArray[0].iIntValue; + } + CleanupStack::PopAndDestroy( &configInfoArray ); + + TRACE_FUNC_EXIT + return power; + } + +// --------------------------------------------------------- +// CBTPsmPlugin::UpdatePsmConfiguration +// Write BTPowerState into PSM Configuration file +// --------------------------------------------------------- +// +void CBTPsmPlugin::SavePsmConfigurationL(TBTPowerStateValue aState) + { + TRACE_FUNC_ENTRY + + TPsmsrvConfigInfo infoForNormal; + infoForNormal.iConfigId = 1; + infoForNormal.iConfigType = EConfigTypeInt; + infoForNormal.iIntValue = aState; + infoForNormal.iBlocked = EFalse; + + RConfigInfoArray configInfo; + configInfo.AppendL(infoForNormal); + iSettingsProvider.BackupSettingsL( configInfo, KCRUidBluetoothPowerState.iUid ); + configInfo.Close(); + + TRACE_FUNC_EXIT + }