datasourcemodules/bluetoothgpspositioningmodule/btgpspsy/src/Settings/BTGPSSettingManager.cpp
changeset 0 9cfd9a3ee49c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/datasourcemodules/bluetoothgpspositioningmodule/btgpspsy/src/Settings/BTGPSSettingManager.cpp	Tue Feb 02 01:50:39 2010 +0200
@@ -0,0 +1,371 @@
+// Copyright (c) 2005-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:
+//
+
+
+
+// INCLUDE FILES
+#include <e32std.h>
+#include <bt_sock.h>
+#include "BtGpsPsyPrivatePSKeys.h"
+#include "BtGpsPsyPrivateCRKeys.h"
+#include "BTGPSSettingManager.h"
+#include "BTGPSSettingsListener.h"
+#include "BTGPSLogging.h"
+
+// CONSTANTS
+
+// BT GPS PSY specific setting partial Id 
+const TUint32 KBTGPSPSYSpecificSettingsPartialId = 0x10000000;
+
+// BT GPS PSY specific setting mask
+const TUint32 KBTGPSPSYSpecificSettingsMask = 0xF0000000;
+
+
+// MACROS
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+
+// -----------------------------------------------------------------------------
+// CBTGPSSettingManager::NewL
+// -----------------------------------------------------------------------------
+CBTGPSSettingManager* CBTGPSSettingManager::NewL()
+    {
+    CBTGPSSettingManager* self = new (ELeave) CBTGPSSettingManager();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CBTGPSSettingManager::~CBTGPSSettingManager
+// -----------------------------------------------------------------------------
+CBTGPSSettingManager::~CBTGPSSettingManager()
+    {
+    //Set setting to unload status. All erros are ignored in destruction
+    iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyState,           EPSYNotLoaded); 
+	iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyBatteryLevel,    KErrNotFound); 
+	iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyBatteryState,    EBatteryStateNA); 
+	iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyExtAntennaState, EExtAntennaNA); 
+	iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyExtPowerState,   EExtPowerNA); 
+	iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyVersion,         KNullDesC); 
+	iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyBtHwVersion,     KNullDesC); 
+	iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyBtSwVersion,     KNullDesC); 
+	iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyGpsHwVersion,    KNullDesC); 
+	iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyGpsSwVersion,    KNullDesC);
+	
+	iEvents.Close();
+	
+	Cancel();
+	
+	delete iSettings;
+	
+	iListenerArray.Reset();
+	iListenerArray.Close();
+    }
+
+// -----------------------------------------------------------------------------
+// CBTGPSSettingManager::ConstructL
+// -----------------------------------------------------------------------------
+void CBTGPSSettingManager::ConstructL()
+    {
+	TRACESTRING("CBTGPSSettingManager::ConstructL()")
+
+    TInt err(KErrNone);
+
+	//Define P&S events
+	TSecurityPolicy readPolicy(ECapabilityReadDeviceData);
+	TSecurityPolicy writePolicy(ECapabilityWriteDeviceData);	
+	err |= iEvents.Define(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyState,            RProperty::EInt, readPolicy, writePolicy); 
+	err |= iEvents.Define(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyBatteryLevel,     RProperty::EInt, readPolicy, writePolicy); 
+	err |= iEvents.Define(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyBatteryState,     RProperty::EInt, readPolicy, writePolicy); 
+	err |= iEvents.Define(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyExtAntennaState,  RProperty::EInt, readPolicy, writePolicy); 
+	err |= iEvents.Define(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyExtPowerState,    RProperty::EInt, readPolicy, writePolicy); 
+	err |= iEvents.Define(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyVersion,          RProperty::EByteArray, readPolicy, writePolicy); 
+	err |= iEvents.Define(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyBtHwVersion,      RProperty::EByteArray, readPolicy, writePolicy); 
+	err |= iEvents.Define(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyBtSwVersion,      RProperty::EByteArray, readPolicy, writePolicy); 
+	err |= iEvents.Define(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyGpsHwVersion,     RProperty::EByteArray, readPolicy, writePolicy); 
+	err |= iEvents.Define(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyGpsSwVersion,     RProperty::EByteArray, readPolicy, writePolicy); 
+
+	if(err!=KErrAlreadyExists)
+	    {
+	    User::LeaveIfError(err);
+	    }
+	
+    err = KErrNone;
+    
+    err |= iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyState,            EPSYLoaded); 
+	err |= iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyBatteryLevel,     KErrNotFound); 
+	err |= iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyBatteryState,     EBatteryStateNA); 
+	err |= iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyExtAntennaState,  EExtAntennaNA); 
+	err |= iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyExtPowerState,    EExtPowerNA); 
+	err |= iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyVersion,          KNullDesC); 
+	err |= iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyBtHwVersion,      KNullDesC); 
+	err |= iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyBtSwVersion,      KNullDesC); 
+	err |= iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyGpsHwVersion,     KNullDesC); 
+	err |= iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyGpsSwVersion,     KNullDesC); 
+	
+	User::LeaveIfError(err);
+	
+    //Construct Central Repositary Setting
+    iSettings = CRepository::NewL(KCRUidBtGpsPsy );
+    iSettings->NotifyRequest(
+        KBTGPSPSYSpecificSettingsPartialId, 
+        KBTGPSPSYSpecificSettingsMask,
+        iStatus);
+    SetActive();
+    
+    }
+
+// -----------------------------------------------------------------------------
+// CBTGPSSettingManager::CBTGPSSettingManager
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+CBTGPSSettingManager::CBTGPSSettingManager() :
+    CActive(EPriorityStandard)
+    {
+    CActiveScheduler::Add(this);
+    }
+    
+// -----------------------------------------------------------------------------
+// CBTGPSSettingManager::UpdatePsyState
+// Updates the client for new BT GPS PSY values.
+// -----------------------------------------------------------------------------
+TInt CBTGPSSettingManager::UpdatePsyState(const TBTGPSPSYState aStatus)
+    {
+    TInt err = KErrNone;
+    TRACESTRING28("CBTGPSSettingManager::UpdateBTGPSPSYStatus: %d", aStatus)
+	err = iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyState, aStatus);
+	if( aStatus != EPSYLoadedAndPNOKSupportedBTGPSUsed )
+		{
+		err |= iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyBatteryLevel,     KErrNotFound); 
+	    err |= iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyBatteryState,     EBatteryStateNA); 
+	    err |= iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyExtAntennaState,  EExtAntennaNA); 
+	    err |= iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyExtPowerState,    EExtPowerNA); 
+	    err |= iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyVersion,          KNullDesC); 
+    	err |= iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyBtHwVersion,      KNullDesC); 
+    	err |= iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyBtSwVersion,      KNullDesC); 
+    	err |= iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyGpsHwVersion,     KNullDesC); 
+    	err |= iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyGpsSwVersion,     KNullDesC); 
+		}
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// CBTGPSSettingManager::UpdateDeviceStatus
+// Updates the client information file for the new status event values 
+// (batterylevel ext. antenna and ext. power state).
+// -----------------------------------------------------------------------------     
+TInt CBTGPSSettingManager::UpdateDeviceStatus(
+        const TInt aBatteryLevel, 
+        const TBTGPSExtPowerState aExtPowerState, 
+        const TBTGPSExtAntennaState aExtAntennaState,
+        const TBTGPSBatteryState aBatteryState )
+    {
+    TRACESTRING("CBTGPSSettingManager::UpdateStatus")
+    
+    TInt err = KErrNone;
+    err |= iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyBatteryLevel,     aBatteryLevel); 
+	err |= iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyBatteryState,     aBatteryState); 
+	err |= iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyExtAntennaState,  aExtAntennaState); 
+	err |= iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyExtPowerState,    aExtPowerState); 
+	
+	return err;
+    }
+    
+// -----------------------------------------------------------------------------
+// CBTGPSSettingManager::UpdateVersions
+// Updates the client information file for the new version (device, BT HW, BT SW,
+// GPS HW and GPS SW) information.
+// ----------------------------------------------------------------------------- 
+TInt CBTGPSSettingManager::UpdateVersions(
+        const TDesC8& aID, 
+        const TDesC8& aBTHW, 
+        const TDesC8& aBTSW, 
+        const TDesC8& aGPSHW, 
+        const TDesC8& aGPSSW)
+    {
+    TInt err = KErrNone;
+    
+    TRACESTRING("CBTGPSSettingManager::UpdateVersions")  
+	TRACETEXT(aID) 
+	TRACETEXT(aBTHW)
+	TRACETEXT(aBTSW)
+	TRACETEXT(aGPSHW)
+	TRACETEXT(aGPSSW)
+	
+	err |= iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyVersion,          aID); 
+	err |= iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyBtHwVersion,      aBTHW);
+	err |= iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyBtSwVersion,      aBTSW);
+	err |= iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyGpsHwVersion,     aGPSHW);
+	err |= iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyGpsSwVersion,     aGPSSW);
+	
+	return err;
+    }
+    
+// -----------------------------------------------------------------------------
+// CBTGPSSettingManager::GetNightModeSetting
+// ----------------------------------------------------------------------------- 
+TInt CBTGPSSettingManager::GetNightModeSetting(TBTGPSSettingsApi::TNightModeState& aStatus)
+    {
+    TInt err = KErrNone;
+    TInt nightMode = KErrNotFound;
+    err |= iSettings->Get(KBluetoothGpsPsyNightModeState, nightMode);
+    switch(nightMode)
+        {
+        case TBTGPSSettingsApi::ENightModeOn:
+        case TBTGPSSettingsApi::ENightModeOff:
+            {
+            aStatus = (TBTGPSSettingsApi::TNightModeState) nightMode;
+            break;
+            }
+        default:
+            return KErrCorrupt;
+        }
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// CBTGPSSettingManager::GetBTDeviceInfo
+// ----------------------------------------------------------------------------- 
+TInt CBTGPSSettingManager::GetBTDeviceInfo(TInt& aValid, TBTSockAddr& aAddress )
+    {
+    TRACESTRING("CBTGPSSettingManager::GetBTDeviceInfo")
+
+    TInt err = KErrNone;
+    err |=  iSettings->Get( KBluetoothGpsPsyDeviceAddressValidity, aValid );
+    TBuf<KMaxSockAddrSize> addressBuffer;
+    err |= iSettings->Get( KBluetoothGpsPsyDeviceAddress, addressBuffer );
+    aAddress.Copy(addressBuffer);
+    
+    TRACESTRING2("err=%d", err)
+    TRACESTRING2("validity=%d", aValid)
+    TRACESTRING28("Address=%S", &aAddress)
+
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// CBTGPSSettingManager::UpdateBTDeviceInfo
+// ----------------------------------------------------------------------------- 
+TInt CBTGPSSettingManager::UpdateBTDeviceInfo(TInt aValid, const TBTSockAddr& aAddress)
+    {
+    TInt err = KErrNone;
+    err |= iSettings->Set(KBluetoothGpsPsyDeviceAddressValidity, aValid);
+    
+    TBuf<KMaxSockAddrSize> addressBuffer;
+    addressBuffer.Copy(aAddress);
+    err |= iSettings->Set(KBluetoothGpsPsyDeviceAddress , addressBuffer);
+    
+    return err;
+    }
+    
+// -----------------------------------------------------------------------------
+// CBTGPSSettingManager::ResetEventStatuses
+// ----------------------------------------------------------------------------- 
+void CBTGPSSettingManager::ResetEventStatuses()
+    {
+    //Reset status events in P&S. All errors are ignored.
+    iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyState,            EPSYLoaded); 
+    iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyBatteryLevel,     KErrNotFound); 
+	iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyBatteryState,     EBatteryStateNA); 
+	iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyExtAntennaState,  EExtAntennaNA); 
+	iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyExtPowerState,    EExtPowerNA); 
+	iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyVersion,          KNullDesC); 
+    iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyBtHwVersion,      KNullDesC); 
+    iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyBtSwVersion,      KNullDesC); 
+    iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyGpsHwVersion,     KNullDesC); 
+    iEvents.Set(KPsUidBluetoothGpsPsy, KBluetoothGpsPsyGpsSwVersion,     KNullDesC); 
+    }	
+	
+// -----------------------------------------------------------------------------
+// CBTGPSSettingManager::HandleSettingsChangeL
+// Callback function from MPosSettingsObserver. The Positioning Plug-in API
+// uses this to inform changes in the observable file.
+// ----------------------------------------------------------------------------- 
+void CBTGPSSettingManager::HandleSettingsChange()
+	{
+	TRACESTRING("CBTGPSSettingManager::HandleSettingsChange start ...")
+	
+	//Get night mode status
+	TInt nightMode;
+	iSettings->Get( KBluetoothGpsPsyNightModeState, nightMode );
+	
+	//Inform listeners on night mode setting change.
+    TInt count = iListenerArray.Count();
+    for(TInt i=count-1; i>=0; i--)
+        {
+        iListenerArray[i]->HandleNightModeChange(
+            (TBTGPSSettingsApi::TNightModeState)nightMode);
+        }
+	
+	//no change event notifies for dialog status setting change.
+    TRACESTRING("CBTGPSSettingManager::HandleSettingsChange end")
+	}
+	
+// -----------------------------------------------------------------------------
+// CBTGPSSettingManager::RunL
+// ----------------------------------------------------------------------------- 
+void CBTGPSSettingManager::RunL()
+    {
+	TRACESTRING2("CBTGPSSettingManager::RunL start ....%d", iStatus.Int())
+    //Issue request right after. Otherwise we may miss some change notification
+    iSettings->NotifyRequest(
+        KBTGPSPSYSpecificSettingsPartialId, 
+        KBTGPSPSYSpecificSettingsMask,
+        iStatus);
+    SetActive();
+    
+    HandleSettingsChange();
+	TRACESTRING("CBTGPSSettingManager::RunL end")
+    }
+
+// -----------------------------------------------------------------------------
+// CBTGPSSettingManager::DoCancel
+// ----------------------------------------------------------------------------- 
+void CBTGPSSettingManager::DoCancel()
+    {
+    if(iSettings!=NULL)
+        {
+        iSettings->NotifyCancelAll();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CBTGPSSettingManager::AddListenerL
+// ----------------------------------------------------------------------------- 
+void CBTGPSSettingManager::AddListenerL(MBTGPSSettingsListener& aListener)
+    {
+    User::LeaveIfError(iListenerArray.Append(&aListener));
+    }
+        
+// -----------------------------------------------------------------------------
+// CBTGPSSettingManager::RemoveListener
+// ----------------------------------------------------------------------------- 
+void CBTGPSSettingManager::RemoveListener(MBTGPSSettingsListener& aListener)
+    {
+    TInt index = iListenerArray.Find(&aListener);
+    if(index!=KErrNone)
+        {
+        iListenerArray.Remove(index);
+        }
+    }
+
+
+
+//  End of File